我最近接触过一些Perl代码,它的某些方面对我来说仍然是难以捉摸的.就是这个:
@collection = <*>;
Run Code Online (Sandbox Code Playgroud)
我知道at符号定义collection
为数组.我也搜索了一下,然后登陆perldoc,特别是关于I/O操作员的部分.我发现null filelhandle特别有趣; 代码如下.
while (<>) {
...
}
Run Code Online (Sandbox Code Playgroud)
在同一主题上我也注意到这个语法也是有效的:
while (<*.c>) {
...
}
Run Code Online (Sandbox Code Playgroud)
根据perldoc它实际上调用一个内部函数,其调用glob
方式类似于以下代码:
open(FOO, "echo *.c | tr -s ' \t\r\f' '\\012\\012\\012\\012'|");
while (<FOO>) {
...
}
Run Code Online (Sandbox Code Playgroud)
第一行提到的小于,星号,超过(<*>)符号实际上做了什么?它是对内部开放和引用的glob的引用吗?它会是一个特殊情况,例如null文件句柄吗?或者它可以是完全不同的东西,比如传统的实现?
<>
(菱形运算符)用于两种不同的语法.
<*.c>
,<*>
等是速记水珠的内置功能.因此,<*>
返回当前目录中所有文件和目录的列表.(除了以点开头的那些; <* .*>
用于此).
<$fh>
是电话的简写readline($fh)
.如果没有指定文件句柄(<>
),则假定神奇的*ARGV句柄,它是指定为命令行参数的文件列表,如果没有提供标准输入则是标准输入.如你所述,perldoc详细介绍了这两个方面.
Perl如何区分这两者?它检查里面的东西<>
是裸文件句柄还是文件句柄的简单标量引用(例如$fh
).否则,它会调用glob()
.这甚至适用于这样的东西<$hash{$key}>
或者<$x >
-它会被解释为一个呼叫glob()
.如果你进一步阅读perldoc,这就解释了 - glob()
如果你在里面放一个变量<>
来避免这些问题,建议你明确使用它.