<*>符号的含义

Ono*_*dai 3 io perl perldoc

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

rjh*_*rjh 5

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

<*.c>,<*>等是速记水珠的内置功能.因此,<*>返回当前目录中所有文件和目录的列表.(除了以点开头的那些; <* .*>用于此).

<$fh>是电话的简写readline($fh).如果没有指定文件句柄(<>),则假定神奇的*ARGV句柄,它是指定为命令行参数的文件列表,如果没有提供标准输入则是标准输入.如你所述,perldoc详细介绍了这两个方面.

Perl如何区分这两者?它检查里面的东西<>是裸文件句柄还是文件句柄的简单标量引用(例如$fh).否则,它会调用glob().这甚至适用于这样的东西<$hash{$key}>或者<$x >-它会被解释为一个呼叫glob().如果你进一步阅读perldoc,这就解释了 - glob()如果你在里面放一个变量<>来避免这些问题,建议你明确使用它.