【问题标题】:Does the Perl diamond operator iterate over non-magic arrays (not @ARGV)?Perl 菱形运算符是否迭代非魔术数组(不是@ARGV)?
【发布时间】:2009-10-28 23:11:23
【问题描述】:

我不认为以下应该有效,但确实有效:

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

据我所知,Perl 的 &lt;&gt; 运算符应该适用于文件句柄、glob 等,但文字 &lt;&gt;(而不是 &lt;FILEHANDLE&gt;)除外,它神奇地迭代了 @ARGV

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

【问题讨论】:

  • 来自 perlop(1) 关于 和 @ARGV:它是这样工作的:第一次评估 时,检查 @ARGV 数组,如果它为空,则 $ARGV[0 ] 设置为“-”,打开时为您提供标准输入。然后将@ARGV 数组作为文件名列表进行处理。我可以看到我的@a 发生了类似的事情,尽管似乎每个数组都不应该发生这种情况(而且我知道 foreach 或 map 是处理数组的更好方法)。我仍然想知道为什么不用钻研代码

标签: perl arrays diamond-operator


【解决方案1】:

魔法在起作用!

来自“perldoc perlop”:

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

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

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

【讨论】:

  • 好的,所以我刚起床,但我根本没有得到#3。
  • 行为是:除非在其参数中存在模式匹配元字符,否则 glob 不会费心去文件系统。这可能令人惊讶。它可以帮助我从 shell glob 功能的角度来思考它,perl 的 glob 旨在模仿:如果你说 'cat foo',shell 会使用参数 'foo' 调用 'cat',无论是否有 'foo'存在。如果你说 'cat foo.*',shell 将使用可变参数调用 'cat',具体取决于与模式匹配的内容(如果有的话)。
【解决方案2】:

这是在调用glob

【讨论】:

    【解决方案3】:

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

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

    附:不过,谢谢你,这对于代码高尔夫比赛来说非常有用。

    【讨论】:

    • 请勿发布指向未经授权的图书副本的链接。
    • 哎呀,我什至没有意识到。对不起那个。
    • foreach(@a) 和 while() 一样短小精悍,所以在代码高尔夫中帮助不大。
    • ...和for(@a) 完全等同于foreach(@a),但短了4 个字符,这在打高尔夫球时很有帮助。
    猜你喜欢
    • 1970-01-01
    • 2012-01-24
    • 1970-01-01
    • 2015-02-06
    • 2013-04-27
    • 1970-01-01
    • 2013-01-07
    相关资源
    最近更新 更多