我最近接触过一些Perl代码,但它的某些方面对我来说仍然是难以捉摸的。就是这样:
@collection = <*>;
我知道at符号将collection
定义为数组。我也搜索了一下,然后降落在perldoc上,特别是在约I/O Operators的部分。我发现null filelhandle特别有趣;代码如下。
while (<>) {
...
}
在同一主题上,我也注意到这种语法也有效:
while (<*.c>) {
...
}
根据perldoc它实际上是调用一个内部函数,它以类似下面代码的方式调用glob
:
open(FOO, "echo *.c | tr -s ' \t\r\f' '\\012\\012\\012\\012'|");
while (<FOO>) {
...
}
第一行提到的小于,星号,超过(&lt; *&gt; )符号实际上做了什么?它是对内部开放和引用的glob的引用吗?它会是一个特殊情况,例如null文件句柄吗?或者它可以是完全不同的东西,比如传统的实现?
答案 0 :(得分:5)
<>
(菱形运算符)用于两种不同的语法。
<*.c>
,<*>
等是glob内置函数的简写。因此<*>
返回当前目录中所有文件和目录的列表。 (除了以点开头的那些;使用<* .*>
)。
<$fh>
是调用readline($fh)
的简写。如果没有指定文件句柄(<>
),则假定魔法* ARGV句柄,它是指定为命令行参数的文件列表,如果没有提供标准输入则是标准输入。如您所述,the perldoc详细介绍了这些内容。
Perl如何区分这两者?它检查<>
中的内容是否是文件句柄的裸文件句柄或简单标量引用(例如$fh
)。否则,它会调用glob()
。这甚至适用于<$hash{$key}>
或<$x >
之类的内容 - 它将被解释为对glob()
的调用。如果你进一步阅读perldoc,可以解释一下 - 如果你在glob()
中放置一个变量,建议你明确地使用<>
来避免这些问题。
答案 1 :(得分:1)
它收集当前目录中的所有文件名并将它们保存到数组集合中。除了以点开头的那些。它与:
相同@collection = glob "*";