Почему perl переводит галочку в двоеточие?
Учитывая эту программу:
use strict;
use warnings;
my $zx_size = 32;
my $x = "$zx_size'h0";
Perl говорит мне следующее:
Name "zx_size::h0" used only once: possible typo at concat.pl line 7.
Use of uninitialized value $zx_size::h0 in string at concat.pl line 7.
Почему?
Похоже, существует несколько способов указать пространство имен для var. Есть ли другие?
Можно ли отключить это поведение?
Ответы
Ответ 1
Старый разделитель пакетов был одинарной цитатой '
, которая изначально использовалась для облегчения перехода на Perl для программистов Ada. Он был заменен на ::
, чтобы быть более читаемым и облегчить переход программистов на С++.
Он по-прежнему поддерживается для обратной совместимости, но вы можете обернуть скаляр в {..}
, чтобы он правильно интерполировал.
my $x = "${zx_size}'h0";
или
my $x = "$zx_size\'h0";
Ответ 2
Символ одиночной кавычки '
использовался предыдущими Perls для обозначения области пакета так же, как ::
, и он по-прежнему поддерживается для обратной совместимости.
Чтобы сделать то, что вы хотите, вам нужно использовать синтаксис ${}
, чтобы сообщить Perl, где заканчивается идентификатор, и начинается литерал:
"${zx_size}'h0"
Обратите внимание, что это то же самое, что вам нужно было бы сделать, если бы вы хотели значение $zx_size
, за которым следовал любой другой литерал, который должен появиться в идентификаторе:
"${zx_size}foo"
Ответ 3
Прочитайте perlmod. Самый второй абзац. И нет, нет способа отключить его, по крайней мере пока. Теоретически, кто-то мог написать прагму no feature
для нее, но так было 20 лет, не вызывая слишком много проблем...