3

我最近接触了一些 Perl 代码,它的某些方面对我来说仍然难以捉摸。就是这个:

@collection = <*>;

我知道 at-symbol 定义collection为一个数组。我也搜索了一下,并登陆了 perldoc,特别是关于I/O Operators的部分。我发现空文件句柄特别有趣;代码如下。

while (<>) {
    ...
}

在同一主题上,我还注意到这种语法也是有效的:

while (<*.c>) {
    ...
}

根据 perldoc 它实际上是在调用一个内部函数,该函数glob以类似于以下代码的方式调用:

open(FOO, "echo *.c | tr -s ' \t\r\f' '\\012\\012\\012\\012'|");
while (<FOO>) {
    ...
}

问题

第一行中提到的小于、星号、大于 ( <*> ) 符号实际上是做什么的?它是对内部开放和引用的 glob 的引用吗?会不会是特殊情况,例如空文件句柄?或者它可以是完全不同的东西,比如遗留实现?

4

2 回答 2

5

<>菱形运算符)用于两种不同的语法。

<*.c><*>glob内置函数的简写。所以<*>返回当前目录中所有文件和目录的列表。(除了那些以点开头的;<* .*>用于那个)。

<$fh>是 call 的简写readline($fh)。如果未指定文件句柄 ( <>),则假定为神奇的 *ARGV 句柄,它是指定为命令行参数的文件列表,如果未提供则为标准输入。正如您所提到的, perldoc详细介绍了两者。

Perl 如何区分这两者?它检查里面的东西<>是一个裸文件句柄还是一个对文件句柄的简单标量引用(例如$fh)。否则,它会调用glob()。这甚至适用于诸如<$hash{$key}>或之类的东西<$x >-它将被解释为对glob(). 如果您进一步阅读 perldoc,则会对此进行解释 -glob()如果您将变量放入其中<>以避免这些问题,建议您显式使用。

于 2013-09-28T21:17:56.093 回答
1

它收集当前目录中的所有文件名并将它们保存到数组集合中。以点开头的除外。它与以下内容相同:

@collection = glob "*";
于 2013-09-28T21:16:34.417 回答