Perl钻石运算符是否迭代非魔术数组(不是@ARGV)?

时间:2009-10-28 23:11:24

标签: perl arrays diamond-operator

我不认为以下内容应该有效,但确实如此:

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

据我所知,Perl的<>运算符应该对文件句柄,整数等进行处理,但文字<>(而不是<FILEHANDLE>)除外,它们神奇地迭代超过@ARGV

是否有人知道它是否应该像我在测试中那样工作?

3 个答案:

答案 0 :(得分:11)

魔术在工作!

来自“perldoc perlop”:

  

如果尖括号内的内容既不是文件句柄也不是简单的标量变量   包含文件句柄名称,typeglob或typeglob引用,它是   解释为文件名   要被全局化的模式,以及文件名列表或下一个   列表中的文件名是   根据具体情况返回。

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

  1. &LT; @一个&GT;是(在语法上,在编译时)被确定为glob扩展
  2. 因此&lt;&gt;将@a转换为字符串“1222 2 3”(数组的字符串插值)
  3. 列表上下文中的
  4. glob(“1222 2 3”)返回('1222','2','3')

答案 1 :(得分:1)

这是在调用glob

答案 2 :(得分:-1)

  

<FH>不是文件句柄的名称,而是在句柄上执行行输入操作的角度运算符。当人们尝试打印角度算子“ - Programming Perl

时,这种混乱通常会表现出来

所以在你的情况下,数组是一个句柄,这是有道理的,因此运算符迭代它。所以在回答你的问题时,是的,我认为这是标准的(但是模糊不清)Perl。这是模糊的,因为语言有更明显的方法来迭代数组。

P.S。但是,多亏了这一点,这对于代码高尔夫比赛来说非常棒。