Короткий ответ: строка копирует содержимое ссылки на га sh на именованную ха sh. Программисту, вероятно, неудобно ссылочный синтаксис. Ничего особенного, oop.
Ключевая концепция, которую люди пропускают о символах Perl 5, заключается в том, что они показывают, как вы обрабатываете переменную, а не какой она. $
- это отдельные элементы, @
- это несколько элементов. %
- это ха sh материал.
* %
означает переменную ha sh в целом . Итак, %form
- это целое ха sh, названное "формой". Но, чтобы извлечь из него один элемент, вы используете символ $
(single element). Когда вы видите {}
после переменной, вы знаете, что имеете дело с ха sh:
%form # entire hash named "form"
$form{foo} # single value for key "foo" in hash form
@form{qw(foo bar)} # multiple value for keys "foo" and "bar" (slice)
Второй вариант более сложный (это то, что мы рассмотрим в Intermediate Perl. $input
- это ссылка на га sh. Все ссылки являются скалярами (то есть, символ $
). Чтобы использовать его как га sh, вы должны почтить его. в таком простом скаляре вы можете поместить символ ha sh впереди:% $ input. Теперь вы можете рассматривать это как ha sh и использовать операторы ha sh (keys
, values
, delete
) на нем.
Начиная с v5.26, есть также разыменование постфикса , так что вы можете читать слева направо: $input->%*
.
%$input # entire hash referenced by $input
$input->%* # entire hash, with new hotness postfix deref
${$input}{foo} # single element access: extra $ in front, braces around ref
$$input{foo} # same thing
$input->{foo} # single element access with arrow and braces
@{$input}{qw(foo bar)} # hash slice, multiple items get `@`
@$input{qw(foo bar)} # same thing
$input->@{qw(foo bar)} # same thing, but with postfix notation
Теперь есть еще более сложная вещь: v5.20 представляет срез key-value , поэтому %
еще предстоит проделать дополнительную работу. Это срез, который возвращает ключи вместе с значения, поэтому он получает %
для га sh как вещи:
%form{qw(key1 key2)} # returns a list of key-value pairs
Но это также работает на массивах, чтобы получить индекс и значение. Вы знаете, что это массив потому что вы видите []
, но вы знаете, что он возвращает пары индекс-значение, потому что вы видите %
:
%array[1,3,7] # returns list like ( 1, ..., 3, ..., 7, ...)