Как работает оператор двойной стрелки (=›) в 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";

Что именно означает =>? Есть ли другие способы использования =>?


person Lazer    schedule 04.11.2010    source источник
comment
Справедливо. В свою защиту я использовал Google, который отклонил поиск =>.   -  person Lazer    schedule 04.11.2010
comment
А несколько лет спустя у нас есть symbolhound для таких поисков. Как ни странно, одним из топовых результатов оказался... вот этот вопрос :)   -  person mu is too short    schedule 29.06.2013
comment
Меня только что впервые заставили читать сценарии Perl, и возник этот вопрос. Это было полезно.   -  person John Phu Nguyen    schedule 07.06.2017
comment
Это действительно эзотерическая вещь. Хотелось бы, чтобы была книга о таких классных вещах. Кто знает, может быть, он уже есть.   -  person User9102d82    schedule 07.08.2018


Ответы (2)


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

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

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

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

$ perl -e 'print hello => "world\n"'
helloworld
person Ben Jackson    schedule 04.11.2010
comment
Итак, что делает Readonly my $infilename => "input_56_12.txt";? - person Lazer; 04.11.2010
comment
Это просто запятая. Вы можете переписать его как: Readonly(my $infilename, "input_56_12.txt");. Дополнительные сведения о модуле только для чтения (альтернатива константе) см. на странице search.cpan.org/perldoc. ?Только чтение - person OMG_peanuts; 04.11.2010

Из 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 я нашел полезную информацию о толстых запятых =>, и я думаю, что было бы неплохо упомянуть ее и здесь.

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

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

my %h = ( FOO => 23 );

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

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

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

 Readonly my $FOO => "23";

Дополнительные сведения см. в разделе Глава 4: Значения и выражения (жирные запятые) Perl Best Practices.

person Nikhil Jain    schedule 04.11.2010