Что означают квадратные скобки в следующем синтаксисе push в Perl? - PullRequest
5 голосов
/ 14 июля 2009

Я столкнулся с этим синтаксисом при чтении сценария. Я не уверен, что толку в квадратных скобках.

push @data, [ split //, $line ]; #printing this array gives crap values

Или, говоря другими словами, в чем разница между вышесказанным и следующим?

push @data, (split//, $line); #printing this gives actual values

Есть предложения?

Ответы [ 2 ]

13 голосов
/ 14 июля 2009

код:

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

4 голосов
/ 14 июля 2009

Это один из моих ответов :

push @data, [ split //, $line ];

@data - это массив ссылок на массив. Каждый элемент @data является ссылкой на анонимный массив, записи которого являются символами в $line.

См. Также perldoc perlreftut .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...