Что означает% в Perl? - PullRequest
       8

Что означает% в Perl?

0 голосов
/ 28 апреля 2020

Прошло много лет с тех пор, как я был в Perl, и я чувствую, что мне нужно вернуться к скорости. У меня есть строка кода, которую я не знаю, что это значит.

%form = %$input;

Может кто-нибудь объяснить или направить меня туда, где я могу найти ответ на этот вопрос? Я не понимаю символ%.

1 Ответ

1 голос
/ 29 апреля 2020

Короткий ответ: строка копирует содержимое ссылки на га 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, ...)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...