В чем разница между хэшем и ссылкой на хэш в Perl?
-
08-07-2019 - |
Вопрос
Я хотел бы правильно понимать хэши в Perl.Мне приходилось использовать Perl с перерывами в течение довольно долгого времени, и в основном всякий раз, когда мне это нужно, это в основном связано с обработкой текста.
И каждый раз, когда мне приходится иметь дело с хэшами, все путается.Я нахожу синтаксис хэшей очень загадочным
Хорошее объяснение хэшей и ссылок на хэши, их различий, когда они требуются и т.д.был бы вам очень признателен.
Решение
Простой хэш близок к массиву.Их инициализации даже выглядят похожими.Сначала массив:
@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";
Допустим, мы хотим представить информацию лишь с немного более богатой структурой:
- Кливер (фамилия)
- Подопечный (имя)
- Июнь (имя супруга/супруги)
- Флинстоун
- Фред
- Вильма
- Бункер
- Арчи
- Эдит
До появления ссылок плоские хэши ключ-значение были едва ли не лучшим, что мы могли сделать, но ссылки позволяют
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
во фрагменте выше есть хэш-ссылка, стрелка обязательна.Если вы оставите это без внимания, но разумно включите use strict
чтобы помочь вам отловить такого рода ошибки, компилятор будет жаловаться:
Global symbol "%fred" requires explicit package name at ...
Ссылки Perl аналогичны указателям в C и C ++, но они никогда не могут быть нулевыми.Указатели в C и C ++ требуют разыменования, как и ссылки в Perl.
Параметры функций C и C ++ имеют семантику передачи по значению:это просто копии, поэтому изменения не возвращаются вызывающему абоненту.Если вы хотите увидеть изменения, вы должны передать указатель.Вы можете получить этот эффект с помощью ссылок в Perl:
sub add_barney {
my($personal_info) = @_;
$personal_info->{Rubble} = {
FIRST => "Barney",
SPOUSE => "Betty",
};
}
add_barney \%personal_info;
Без обратной косой черты, add_barney
получил бы копию, которая была бы выброшена, как только субмарина вернется.
Обратите также внимание на использование "жирной запятой" (=>
) выше.Он автоматически заключает строку в кавычки слева от нее и делает инициализацию хэша менее синтаксически шумной.
Другие советы
Ниже показано, как вы можете использовать хеш и ссылку на хеш:
my %hash = (
toy => 'aeroplane',
colour => 'blue',
);
print "I have an ", $hash{toy}, " which is coloured ", $hash{colour}, "\n";
my $hashref = \%hash;
print "I have an ", $hashref->{toy}, " which is coloured ", $hashref->{colour}, "\n";
См. также perldoc perldsc .
Хеш - это основной тип данных в Perl. Он использует ключи для доступа к своему содержанию.
Ссылка на хэш - это сокращение от ссылка на хеш. Рекомендации скаляры, то есть простые значения. это скалярное значение, которое содержит по сути, указатель на фактический сам хеш.
Ссылка: разница между хэшем и хэшем в perl - Форумы Ubuntu
Разница также в синтаксисе удаления. Как и C, Perl работает так же для хэшей:
delete $hash{$key};
и для хеш-ссылок
delete $hash_ref->{$key};
Perl Hash Howto является отличный ресурс для понимания хешей и хешей с помощью хеш-ссылок
Здесь также есть еще одна ссылка , которая содержит дополнительную информацию о Perl и ссылках а>. р>
См. perldoc perlreftut , который также доступен в командной строке вашего компьютера.
Ссылка - это скалярное значение, которое относится ко всему массиву или целому хешу (или ко всему остальному). Имена - это один из видов ссылок, с которым вы уже знакомы. Подумайте о президенте Соединенных Штатов: грязный, неудобный мешок с кровью и костями. Но чтобы говорить о нем или представлять его в компьютерной программе, все, что вам нужно, - это простая и удобная скалярная строка «Барак Обама».
Ссылки в Perl похожи на имена для массивов и хэшей. Это личные, внутренние имена Perl, так что вы можете быть уверены, что они однозначны. В отличие от «Барака Обамы», ссылка относится только к одной вещи, и вы всегда знаете, к чему она относится. Если у вас есть ссылка на массив, вы можете восстановить весь массив из него. Если у вас есть ссылка на хеш, вы можете восстановить весь хеш. Но ссылка все еще является простым, компактным скалярным значением.