Ссылки на массивы, к которым относятся анонимные массивы, позволяют 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 );
Если вас заинтересовал другой аспект этого вопроса, вы можете обновить свой вопрос.