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