方括号在Perl中按照推送语法表示什么?

shu*_*ter 5 arrays perl reference

我在阅读脚本时遇到了这种语法.我不确定方括号的用途是什么.

push @data, [ split //, $line ]; #printing this array gives crap values
Run Code Online (Sandbox Code Playgroud)

或者换句话说,上面和下面的区别是什么?

push @data, (split//, $line); #printing this gives actual values
Run Code Online (Sandbox Code Playgroud)

有什么建议?

Ken*_*ric 13

代码:

push @data, (split//, $line);
Run Code Online (Sandbox Code Playgroud)

将当前行中的所有项目推入 @data

push @data, [split //, $line]; 
Run Code Online (Sandbox Code Playgroud)

将对包含这些项的匿名数组的引用推送到 @data

如果您只处理一个'$ line'值,那么使用前一个*1可能更有效,但是,如果您正在处理包含多行的文件,并且您想要区分内容所在的行,后者更有效.

考虑:

my @data; 
while( my $line = <$fh> ){
  push @data , ( split //,  $line ); 
}
use Data::Dumper; 
$Data::Dumper::Indent = 0; 
$Data::Dumper::Terse = 1;
print Dumper( \@data ); 
Run Code Online (Sandbox Code Playgroud)

这将产生作为单独字符读入的所有字节,包含所有字节的单个数组,即:

[ "a", "b" , "c" , "\n", "d", "e", "f" ]
Run Code Online (Sandbox Code Playgroud)

相反,这会做一些完全不同的事情:

my @data; 
while( my $line = <$fh> ){
  push @data , [ split //,  $line ]; 
}
use Data::Dumper; 
$Data::Dumper::Indent = 0; 
$Data::Dumper::Terse = 1;
print Dumper( \@data ); 
Run Code Online (Sandbox Code Playgroud)

而将组合行如下:

[ [ "a", "b", "c" , "\n" ], [ "d" , "e", "f" , "\n" ] ]
Run Code Online (Sandbox Code Playgroud)

所以你以后可以更方便地以编程方式遍历它.

注意:

 push @data, ( split  //, $line ); 
Run Code Online (Sandbox Code Playgroud)

  push @data, split //, $line; 
Run Code Online (Sandbox Code Playgroud)

是等价的.

也,

my @other  = ( 1,2,3 );
push @data, @other ;
Run Code Online (Sandbox Code Playgroud)

push @data, 1,2,3; 
Run Code Online (Sandbox Code Playgroud)

是等价的.

perldoc -f push

push ARRAY,LIST

Treats ARRAY as a stack, and pushes the values of LIST onto the end of ARRAY.  The length of ARRAY increases by the length of LIST.  Has the same effect as

           for $value (LIST) {
               $ARRAY[++$#ARRAY] = $value;
           }

but is more efficient.  Returns the number of elements in the array following the completed "push".

*1:实际上,tbf,任何半脑的人都可能想要 @data = split //, $line