Простой хэш близок к массиву. Их инициализации даже выглядят похожими.Первый массив:
@last_name = (
"Ward", "Cleaver",
"Fred", "Flintstone",
"Archie", "Bunker"
);
Теперь давайте представлять ту же информацию с хэш (так называемый ассоциативный массив):
%last_name = (
"Ward", "Cleaver",
"Fred", "Flintstone",
"Archie", "Bunker"
);
Хотя они имеют такое же имя, массив @last_name
и хэш %last_name
являются полностью независимыми ,
С массива, если мы хотим знать фамилию Арчи, мы должны выполнить линейный поиск:
my $lname;
for (my $i = 0; $i < @last_name; $i += 2) {
$lname = $last_name[$i+1] if $last_name[$i] eq "Archie";
}
print "Archie $lname\n";
С хэша, это гораздо более прямой синтаксически:
print "Archie $last_name{Archie}\n";
Say мы хотим представить информацию только с немного более богатой структурой:
- Кливер (фамилия)
- Ward (первое название)
- июня (первое имя супруга)
- щебенки
- Бункер
До ссылки пришли вместе, плоские ключ-значение хеша было около лучшее, что мы могли бы сделать, но ссылки позволяют
my %personal_info = (
"Cleaver", {
"FIRST", "Ward",
"SPOUSE", "June",
},
"Flintstone", {
"FIRST", "Fred",
"SPOUSE", "Wilma",
},
"Bunker", {
"FIRST", "Archie",
"SPOUSE", "Edith",
},
);
Внутренне, ключи и значения %personal_info
- все скаляры, но значения являются специальным видом скалярных: хеш-ссылок, созданных с помощью {}
. Ссылки позволяют нам моделировать «многомерные» хеши. Например, мы можем получить Вильма через
$personal_info{Flintstone}->{SPOUSE}
Обратите внимание, что Perl позволяет нам опускать стрелки между индексами, так что выше эквивалентно
$personal_info{Flintstone}{SPOUSE}
Это много не вводить, если вы хотите знать, больше о Фреде, так что вы можете получить ссылку как вид курсора:
$fred = $personal_info{Flintstone};
print "Fred's wife is $fred->{SPOUSE}\n";
Поскольку $fred
в приведенном выше фрагменте кода является hashref, стрелка необходимо.Если оставить его, но мудро позволил use strict
, чтобы помочь вам поймать такого рода ошибок, компилятор будет жаловаться:
Global symbol "%fred" requires explicit package name at ...
ссылки на Perl похожи на указатели в C и C++, но они никогда не может быть пустым. Указатели на C и C++ требуют разыменования, а также ссылки на Perl.
Параметры функции C и C++ имеют семантику pass-by-value: они всего лишь копии, поэтому модификации не возвращаются к вызывающему. Если вы хотите увидеть изменения, вам нужно передать указатель. Вы можете получить этот эффект со ссылками на Perl:
sub add_barney {
my($personal_info) = @_;
$personal_info->{Rubble} = {
FIRST => "Barney",
SPOUSE => "Betty",
};
}
add_barney \%personal_info;
без обратного косых черт, add_barney
получил бы копию, которая сброшенная как только суб возвращения.
Обратите внимание также на использование «жирной запятой» (=>
) выше. Он автоматически выводит строку слева и делает инициализацию хеширования менее синтаксически шумной.
_ * вручает вам яблоко * _ притвориться, что это хэш. _ * руки вы написали направления к яблоку в холодильнике * _ это хеш-ссылка. –
Вы можете ознакомиться с главой Perl_ о хэшах. –
@ ~ quack: Я бы хотел, чтобы это был ответ, а не комментарий, чтобы я мог правильно подправить вас. –