< *>的含义符号

时间:2013-09-28 21:10:05

标签: perl io perldoc

我最近接触过一些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文件句柄吗?或者它可以是完全不同的东西,比如传统的实现?

2 个答案:

答案 0 :(得分:5)

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

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

<$fh>是调用readline($fh)的简写。如果没有指定文件句柄(<>),则假定魔法* ARGV句柄,它是指定为命令行参数的文件列表,如果没有提供标准输入则是标准输入。如您所述,the perldoc详细介绍了这些内容。

Perl如何区分这两者?它检查<>中的内容是否是文件句柄的裸文件句柄或简单标量引用(例如$fh)。否则,它会调用glob()。这甚至适用于<$hash{$key}><$x >之类的内容 - 它将被解释为对glob()的调用。如果你进一步阅读perldoc,可以解释一下 - 如果你在glob()中放置一个变量,建议你明确地使用<>来避免这些问题。

答案 1 :(得分:1)

它收集当前目录中的所有文件名并将它们保存到数组集合中。除了以点开头的那些。它与:

相同
@collection = glob "*";