代码之家  ›  专栏  ›  技术社区  ›  Fulvio Scapin

Perl Diamond运算符是否迭代非魔术数组(不是@argv)?

  •  5
  • Fulvio Scapin  · 技术社区  · 16 年前

    我不认为下面的方法有效,但它确实有效:

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

    据我所知,珀尔的 <> 运算符应该处理文件句柄、全局变量等,文字除外 <> 而不是 <FILEHANDLE> ,它神奇地重复 @ARGV .

    有人知道它是否也能像我测试时那样工作吗?

    3 回复  |  直到 16 年前
        1
  •  10
  •   dlowe    16 年前

    魔法在工作!

    从' perldoc perlop “:

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

    这是您用此代码触发的规则。以下是发生的事情:

    1. <@a>是(语法上,编译时)确定为 glob 膨胀
    2. 因此,<>将@a转换为字符串“1222 2 3”(数组的字符串插值)
    3. 格洛布 列表上下文中的(“1222 2 2 3”)返回(“1222”、“2”、“3”)
        2
  •  1
  •   Sinan Ünür    16 年前

    这是在调用 glob .

        3
  •  -1
  •   Sinan Ünür    16 年前

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

    因此,在您的例子中,数组是一个句柄,这是有意义的,因此,操作符在它上面迭代。所以在回答您的问题时,是的,我认为这是标准的(但不明确的)Perl。它之所以晦涩,是因为语言有更明显的迭代数组的方法。

    不过,多亏了这一点,这将是代码高尔夫比赛的一大亮点。