【问题标题】:Why can't I use the diamond operator with an array in Perl?为什么我不能在 Perl 中将菱形运算符与数组一起使用?
【发布时间】:2011-05-17 08:24:48
【问题描述】:

代码

$ cat test1
hello 
i am 
lazer

nananana
$ cat 1.pl
use strict;
use warnings;

my @fh;
open $fh[0], '<', 'test1', or die $!;

my @res1 = <$fh[0]>;  # Way1: why does this not work as expected?
print @res1."\n"; 

my $fh2 = $fh[0];
my @res2 = <$fh2>;    # Way2: this works!
print @res2."\n";

运行

$ perl 1.pl
1
5
$

我不确定为什么 Way1 不能按预期工作,而 Way2 可以。这两种方法不一样吗?这里发生了什么?

【问题讨论】:

    标签: perl file diamond-operator


    【解决方案1】:

    由于 运算符的双重性质(即它是 glob 还是 readline?),规则是作为 readline,你只能在括号内有一个裸词或一个简单的标量。因此,您必须将数组元素分配给一个简单的标量(如您的示例中所示),或者直接使用 readline 函数。

    【讨论】:

    • perl -le 'print for &lt; &lt; &lt;=&gt; &gt; &gt;'
    • @tchrist:除了成为 glob 的一个有趣的例子之外,还有什么其他的意义吗?
    【解决方案2】:

    因为来自perlop:

    如果尖括号中的内容既不是文件句柄,也不是包含文件句柄名称、typeglob 或 typeglob 引用的简单标量变量,则将其解释为要通配的文件名模式,以及文件名列表或下一个文件名根据上下文返回列表中的。这种区别仅由句法基础决定。这意味着 &lt;$x&gt; 始终是间接句柄的 readline(),但 &lt;$hash{key}&gt; 始终是 glob()。

    您可以将&lt;&gt; 运算符拼写为readline,以避免这种魔法出现问题。

    【讨论】:

      【解决方案3】:

      任何比裸字(解释为文件句柄)或简单标量$var 更复杂的东西都被解释为glob() 函数的参数。只有裸字和简单的标量被视为要由&lt;...&gt; 运算符迭代的文件句柄。

      基本上规则是:

      <bareword> ~~  readline bareword
      <$scalar>  ~~  readline $scalar
      <$array[0]> ~~ glob "$array[0]"
      <anything else> ~~ glob ...
      

      【讨论】:

        【解决方案4】:

        这是因为&lt;$fh[0]&gt;被解析为glob($fh[0])

        改用readline

        my @res1 = readline($fh[0]);
        

        【讨论】:

          猜你喜欢
          • 2014-04-07
          • 2012-01-24
          • 1970-01-01
          • 1970-01-01
          • 2016-03-15
          • 2022-12-03
          • 1970-01-01
          • 2015-09-13
          • 2011-01-26
          相关资源
          最近更新 更多