Каковы преимущества анонимных массивов в Perl? - PullRequest
0 голосов
/ 21 марта 2020

Каковы преимущества анонимного массива в Perl?

1 Ответ

7 голосов
/ 22 марта 2020

Ссылки на массивы, к которым относятся анонимные массивы, позволяют Perl рассматривать массив как один элемент. Это позволяет вам также создавать сложные, вложенные структуры данных. Это относится и к ha sh, коду и ко всем другим ссылочным типам, но здесь я покажу только ссылку ha sh. Вы можете прочитать Intermediate Perl, чтобы узнать больше.

Для немедленного, буквального вопроса, учтите, что существует два способа создать массив: с именованной переменной и без именованной переменная («анонимная»):

my @named_array = ( 1, 3, 7 );

[ 1, 3, 7 ];

Первая строка берет список и сохраняет его в именованной переменной массива. Вы, наверное, привыкли видеть это повсюду.

Эта вторая строка, [ 1, 3, 7 ], ничего не делает. Это просто ценность.

Но, рассмотрим этот аналог, где вы храните скалярное значение в скалярной переменной (перегруженное использование «скаляра» там) и следующую строку, которая является просто значением:

my $number = 6;

6;

Теперь вот трюк. Вы знаете, что можете передать скалярную переменную в подпрограмму. Вы могли бы написать это так:

my $number = 6;
some_sub( $number );

Но зачем вообще беспокоиться о переменной, если это единственное ее использование? Полностью избавьтесь от него и передайте значение напрямую:

some_sub( 6 );

То же самое с анонимными ссылками. Вы можете сначала сделать именованную версию и взять ссылку на нее:

my @array = ( 1, 3, 7 );
some_sub( \@array );

Но, как и в скалярном примере, вам не нужно загромождать свой код именованным массивом, если он только там, так что вы можете получить ссылку на это. Просто сделайте ссылку непосредственно:

some_sub( [ 1, 3, 7 ] );

Но это еще не история, и вам нужно немного узнать о том, как Perl работает, чтобы понять ее.

Зачем вообще ссылки?

Perl в основном строится вокруг скаляров (один элемент) и списков (несколько элементов). Скалярная переменная содержит скалярное значение, а переменная массива содержит список (см. В чем разница между списком и массивом? ).

Существует множество функций, в которых вы можете использовать только скаляр, включая элементы одного списка, ключи ha sh и значения ha sh:

$array[$i] = $single_item;
$hash{$single_item} = $other_single_item;

Другие места, которые всегда список, такой как список аргументов для подпрограммы:

sub some_sub {
    my @args = @_;
    ...
    }

Даже если вы вызовете some_sub с двумя массивами, вы получите один список, сохраненный в @_. Вы не можете сказать, где @array_1 остановился и @array_2 начался. Это все один список, размер которого представляет собой объединенные размеры двух массивов:

some_sub( @array_1, @array_2 );

Ссылка - это способ рассматривать что-то как один элемент. Когда вы получаете этот единственный элемент, вы разыменовываете его, чтобы вернуться к оригиналу.

Это означает, что вы можете сохранить ссылку на массив как значение ha sh:

$hash{$key} = \@some_array; # ref to named variable
$hash{$key} = [ 1, 3, 7 ];  # anonymous array directly

Или вы можете создать список, в котором каждый элемент является ссылкой на массив, а не одним «плоским» списком, который вы видели ранее:

my @Array_of_Arrays = ( \@array_1, \@array_2 , [1,3,7], ... );
my $seventh_of_ninth = $Array_of_Arrays[9][7];

Структуры данных Perl Поваренная книга (perlds c) содержит множество примеров различных видов сложных структур данных, которые вы создаете с помощью ссылок.

Вы можете передавать ссылки на подпрограммы, чтобы элементы массива не смешивались. Этот список аргументов состоит ровно из двух элементов, и внутри подпрограммы вы знаете, с каким массивом вы имеете дело:

some_sub( \@array_1, \@array_2 );

Если вас заинтересовал другой аспект этого вопроса, вы можете обновить свой вопрос.

...