【问题标题】:stat function for perl6perl6 的统计函数
【发布时间】:2019-02-04 08:44:23
【问题描述】:

在 perl6 中是否有另一种方法来获取文件属性详细信息,例如大小、访问时间、修改时间……等,而无需调用本机调用?

根据doc,它“不太可能作为其 POSIX 特定的内置实现”。

除了对 stat 的系统调用之外,还有哪些可用的解决方法?

非常感谢任何想法或建议。

谢谢。

【问题讨论】:

  • 也许modules.perl6.org/dist/P5-X 可以提供服务?
  • 我不得不说这似乎是可行的。事实上,这可能是我一直在寻找的替代方案。但我很惊讶 stat 没有作为内置提供。我将检查模块并返回结果。目前,当我尝试安装任何模块时,zef 会引发错误。我还没有解决这个问题。
  • 这是不幸的,这表明 perl6 是如何误入歧途的。在他的第一个启示录中,Larry Wall 说 perl5 和 perl6 在相同的底层执行模型之上应该是不同的语法。 perl5 可移植地实现stat,用户无需编写特定于系统的本机调用,因此 Perl6 可以而且应该提供相同的功能,但它没有——例如,IO::Path 不提供blocks领域,我碰巧需要。 perl5 的一大价值在于它即使在非 POSIX 系统上也提供 POSIX 功能。 perl6 火鸡打破了这一点。

标签: raku stat file-attributes


【解决方案1】:

the IO::Path doc

例如:

say 'foo'.IO.s; # 3 if 'foo' is an existing file of size 3 bytes

.IO 在字符串上创建一个IO::Path 对象,该对象对应于与字符串给出的路径对应的文件系统条目。

the doc on ACCEPTS查看使用联结同时获取多个属性的示例。


我不确定以下是否太多。如果是,请忽略它。希望对您有所帮助。

您可以通过它的 HOW 对象(也称为高阶工作对象、对象如何工作对象、元对象——无论您想如何称呼它们)来发现/探索 Perl 6 中可用的一些内容,这些对象知道特定类型的对象如何工作.

say IO::Path.^methods

显示:

(BUILD new is-absolute is-relative parts volume dirname basename extension
 Numeric sibling succ pred open watch absolute relative cleanup resolve
 parent child add chdir rename copy move chmod unlink symlink link mkdir
 rmdir dir slurp spurt lines comb split words e d f s l r w rw x rwx z
 modified accessed changed mode ACCEPTS Str gist perl IO SPEC CWD path BUILDALL)

这些是IO::Path 对象上可用的一些方法。

(您可以或多或少地使用副词,例如say IO::Path.^methods(:all),但默认显示旨在为您提供您可能最感兴趣的内容。向上箭头(^)表示方法调用( .methods) 不会发送给调用者,而是“向上”发送,直到它的 HOW 对象,如上所述。)

以下是一次应用其中一些的示例:

spurt 'foo', 'bar'; # write a three letter string to a file called 'foo'. 
for <e d f s l r w rw x rwx z modified accessed changed mode>
  -> $method { say 'foo'.IO."$method"() }

第二行对&lt;...&gt; 构造中按其字符串名称列出的方法执行for 循环。要在给定变量 $qux 的调用者上调用方法,请编写 ."$qux"(...)

【讨论】:

  • 我相信这是我一直在寻找但不知道的东西。我非常感谢您花时间为我提供这些信息。您对如何知道函数提供哪些方法的解释是最有帮助的。我现在可以轻松地检查函数必须提供的方法列表。在命令行上进行了尝试,非常棒。谢谢雷夫。
  • 注意。我的建议只是针对方法。许多例程以两种主要例程形式(methods 和subs)中的任何一种形式提供。许多其他人只是其中之一。通过查看Mu 上可用的方法,您可能会发现.sayMu 具有禅宗佛教的含义,即一切都源于虚无)。然后尝试say foo 并发现sub 也有say 的形式。但是要发现变量,并且 sub 只是不是方法的例程,您必须查看 Stashes。
  • 我不知道 perl6 中方法和子之间的区别。我需要研究这个。这是“新东西”;)。
  • 有趣。你在P5熟悉他们吗?我认为只有sub 可以直接使用P5 的解释器,但method 声明符可以通过CPAN 上的各种OO 子系统获得used。 (你知道 CPAN 吗?)这些 OO 子系统是功能的广阔大陆,它们为 Perl 添加了非常强大的关键字和特性。许多都是十年前家族的成员,称为 Moose、Mouse、Moo 等,他们向 P5 添加了数千个,也许是数万个模块。 P6 在默认 OO 中烘焙,也可以使用 P5 OO 模块。
【解决方案2】:

在 2021 年寻找这个问题的答案时,有 File::Stat 模块。它提供了一些额外的stat(2) 信息,例如UIDGID 和模式。

#!/usr/bin/env raku
use File::Stat <stat>;
say File::Stat.new(path => $?FILE).mode.base(8);
say stat($?FILE).uid;
say stat($?FILE).gid;

【讨论】:

  • 这些也有效say $?FILE.IO.mode; say $?FILE.IO.user; say $?FILE.IO.group;
  • @BradGilbert 我在docs.raku.org中找不到那些方法
  • 另外,'mode' 有效,但只返回模式的 8 个最低有效位。 “没有这种方法”的“用户”和“组”错误。乐版本 2020.07。
  • 我用的是最前沿的版本,已添加16 days ago
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-11-24
  • 1970-01-01
  • 2018-11-28
  • 2019-07-09
  • 2013-11-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多