代码之家  ›  专栏  ›  技术社区  ›  Aakash Goel

为什么我不能在Perl中对数组使用diamond运算符?

  •  11
  • Aakash Goel  · 技术社区  · 14 年前

    代码

    $ 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 做。这两种方法不一样吗??

    4 回复  |  直到 14 年前
        1
  •  14
  •   runrig    14 年前

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

        2
  •  14
  •   Michael Carman    14 年前

    因为从 perlop :

    如果尖括号中既不是filehandle,也不是包含filehandle名称、typeglob或typeglob引用的简单标量变量,则将其解释为要全局化的文件名模式,并根据上下文返回文件名列表或列表中的下一个文件名。这一区别仅仅是由句法上的原因决定的。那意味着 <$x> 始终是间接句柄的readline(),但是 <$hash{key}> 总是一个glob()。

    你可以拼写 <> 操作员组件 readline 而是为了避免魔法的问题。

        3
  •  8
  •   Eric Strom    14 年前

    任何比裸字(解释为文件句柄)或简单标量更复杂的内容 $var 被解释为 glob() 功能。只有裸字和简单标量被视为文件句柄,由 <...> 接线员。

    基本上规则是:

    <bareword> ~~  readline bareword
    <$scalar>  ~~  readline $scalar
    <$array[0]> ~~ glob "$array[0]"
    <anything else> ~~ glob ...
    
        4
  •  6
  •   Eugene Yarmash    14 年前

    是因为 <$fh[0]> 被解析为 glob($fh[0]) .

    使用 readline 相反:

    my @res1 = readline($fh[0]);
    
    推荐文章