код:
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
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