Что означает знак "плюс" в хеше?

У меня есть следующий код Perl, но я не понимаю, что он делает.

use constant ANIMAL => 'rabbit'; 
if ($self->{+ANIMAL}) {
    # Do something here
}

Что означает знак + перед константой ANIMAL?

Ответ 1

От perldoc constant:

У вас могут возникнуть проблемы, если вы используете константы в контексте, который автоматически цитирует открытые слова (как это верно для любого вызова подпрограммы). Например, вы не можете сказать $hash{CONSTANT}, потому что CONSTANT будет интерпретироваться как строка. Используйте $hash{CONSTANT()} или $hash{+CONSTANT}, чтобы предотвратить запуск механизма цитирования с помощью слова. Аналогичным образом, поскольку оператор => сразу приводит в действие одно слово слева от него, вы должны сказать CONSTANT() => 'value' (или просто использовать запятую вместо большая стрелка) вместо CONSTANT => 'value'.

Ответ 2

На основе ответа Дениса Ибаева B:: Deparse может показать, как код анализируется и без использования +:

perl -MO=Deparse,-p script.pl

С +:

use constant ('ANIMAL', 'rabbit');
if ($$self{+'rabbit'}) {
    ();
}
script.pl syntax OK

Без +:

use constant ('ANIMAL', 'rabbit');
if ($$self{'ANIMAL'}) {
    ();
}
script.pl syntax OK

Обратите внимание, что + вызывает использование constant, где используется только слово ANIMAL без +.