代码:
push @data, (split//, $line);
将当前行的所有项目推入@data
和
push @data, [split //, $line];
将包含这些项目的匿名数组的引用推送到@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 );
这将产生作为单独字符读入的所有字节,单个
包含它们的数组,即:
[ "a", "b" , "c" , "\n", "d", "e", "f" ]
当这反而会做一些完全不同的事情时:
my @data;
while( my $line = <$fh> ){
push @data , [ split //, $line ];
}
use Data::Dumper;
$Data::Dumper::Indent = 0;
$Data::Dumper::Terse = 1;
print Dumper( \@data );
并且会像这样对行进行分组:
[ [ "a", "b", "c" , "\n" ], [ "d" , "e", "f" , "\n" ] ]
因此您以后可以更轻松地以编程方式遍历它。
注意:
push @data, ( split //, $line );
和
push @data, split //, $line;
是等价的。
还有,
my @other = ( 1,2,3 );
push @data, @other ;
和
push @data, 1,2,3;
是等价的。
来自perldoc -f push
推数组,列表
将 ARRAY 视为堆栈,并将 LIST 的值推送到 ARRAY 的末尾。 ARRAY 的长度增加了 LIST 的长度。具有相同的效果
对于 $ 值(列表){
$阵列[++$#阵列] = $值;
}
但效率更高。返回完成的“推送”之后数组中的元素数。
*1:实际上,tbf,任何有半脑的人都可能想要@data = split //, $line