Как работает оператор double arrow (=>) в Perl?

Я знаю о хэш-использовании оператора =>, как это

$ cat array.pl
%ages = ('Martin' => 28,
         'Sharon' => 35,
         'Rikke' => 29,);

print "Rikke is $ages{Rikke} years old\n";
$ perl array.pl
Rikke is 29 years old
$

и я думал, что это просто синтаксис для инициализации хэшей, но в ответах на Как я могу квалифицировать переменную как const/final в Perl?, => имеет был использован как

use Readonly;
Readonly my $infilename => "input_56_12.txt";

Что означает =>? Есть ли еще несколько способов использования =>?

Ответы

Ответ 1

Оператор => в perl в основном совпадает с запятой. Единственное различие заключается в том, что если есть некорректное слово слева, оно обрабатывается как цитируемое слово. Таким образом, вы могли бы написать Martin => 28, который был бы таким же, как 'Martin', 28.

Вы можете сделать хэш из любого списка длины, который вы делаете в своем примере.

В вашем примере Readonly используется гибкость Perl с аргументами подпрограммы, опуская скобки. Это эквивалентно Readonly(my $infilename, "input_56_12.txt"). Readonly - это функция, экспортированная модулем Readonly, которая принимает два аргумента: ссылку и значение. Внутренности Readonly достойны другого вопроса, если вы хотите их понять.

Вот пример использования его в виде запятой неожиданным способом:

$ perl -e 'print hello => "world\n"'
helloworld

Ответ 2

От perlop:

Оператор => является синонимом запятая, за исключением того, что вызывает ее левую операнд, который будет интерпретироваться как строка если он начинается с буквы или подчеркивание и состоит только из буквы, цифры и символы подчеркивания.

Это включает операнды, которые могут иначе интерпретироваться как операторы, константы, одиночные числа v-строк или вызовы функций. Если вы сомневаетесь в этом поведение, левый операнд может быть явно цитируется.

В противном случае оператор = > ведет себя точно так же, как оператор запятой или список разделитель аргументов, согласно контекст.

Например:

use constant FOO => "something";
my %h = ( FOO => 23 );

эквивалентно:

my %h = ("FOO", 23);

Это НЕ:

my %h = ("something", 23);

Оператор => полезен в документирование соответствия между ключи и значения в хэшах и другие парные элементы в списках.

%hash = ( $key => $value );
login( $username => $password );

От PBP:

Я нашел хорошую информацию из Perl Best Practices Fat Commas =>, и я думаю, что было бы неплохо также упомянуть здесь.

Лучше зарезервировать жирную запятую исключительно для следующих вещей: -

Используйте его, когда построите хэш:

my %h = ( FOO => 23 );

или при передаче именованных аргументов подпрограммы, т.е.

$text = format_text({FOO => 23, BAR => 30});

или при создании константы:

 Readonly my $FOO => "23";

Подробнее см. раздел Chapter4: Ценности и выражения (Fat Commas) в Perl Best Practices.