5

我认为以下内容不应该起作用,但确实如此:

$ perl -e '@a = qw/1222 2 3/; while (<@a>) { print $_ ."\n";}'
1222
2
3
$

据我所知,Perl 的<>运算符应该在文件句柄、glob 等上工作,除了文字<>(而不是<FILEHANDLE>),它神奇地迭代了@ARGV.

有谁知道它是否应该像我的测试一样工作?

4

3 回答 3

11

魔术在工作!

从“ perldoc perlop ”:

如果尖括号中的内容既不是文件句柄,也不是包含文件句柄名称、typeglob 或 typeglob 引用的简单标量变量,则将其解释为要通配的文件名模式,以及文件名列表或列表中的下一个文件名根据上下文返回。

这是您使用此代码触发的规则。这是正在发生的事情:

  1. <@a> 被(在编译时语法上)确定为全局扩展
  2. 因此 <> 将 @a 转换为字符串“1222 2 3”(数组的字符串插值)
  3. 列表上下文中的glob ("1222 2 3") 返回 ('1222', '2', '3')
于 2009-10-28T23:30:04.930 回答
1

这是调用glob

于 2009-10-28T23:32:10.030 回答
-1

<FH>不是文件句柄的名称,而是对句柄进行行输入操作的角度运算符。当人们尝试打印到角度运算符时,这种混淆通常会表现出来” - Programming Perl

因此,在您的情况下,数组是一个句柄,这是有道理的,因此运算符会对其进行迭代。所以在回答你的问题时,是的,我认为这是标准的(但晦涩的)Perl。它是晦涩难懂的,因为该语言有更明显的方法来迭代数组。

PS 但是,感谢这一点,这对于代码高尔夫比赛来说非常有用。

于 2009-10-28T23:20:45.410 回答