Что квадратные скобки показывают в следующем синтаксисе нажатия в Perl?

В некоторых функциях я добавляю параметр:

..., bool verify = true)

Истинный бросок средств, ложные средства возвращают некоторое ошибочное возвращаемое значение. Таким образом, кто бы ни использует эту функцию, имеет обе опции. Значение по умолчанию должно быть верным, в пользу тех, кто забывает об обработке ошибок.

5
задан Sinan Ünür 3 August 2009 в 19:22
поделиться

2 ответа

Код:

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

13
ответ дан 18 December 2019 в 09:52
поделиться

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

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

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

См. Также perldoc perlreftut .

4
ответ дан 18 December 2019 в 09:52
поделиться
Другие вопросы по тегам:

Похожие вопросы: