Perl, переменное поведение, несоответствие на основе имени

Симптом: $c="foo"; выдает ошибку, а $b="foo"; нет.

Мой сценарий состоит буквально из 3 строк. Следующее не выдает ошибок или предупреждений
use strict;
$b = "foo";
print $b;
но если изменить следующее, я получаю сообщение об ошибке "требуется явное имя пакета".
use strict;
$c = "foo";
print $c;,

Я понимаю, что use strict; требует объявления переменных перед использованием, и изменение $c = "foo"; на my $c = "foo"; действительно предотвращает ошибку, но само по себе это не объясняет несоответствие.

Может ли кто-нибудь пролить свет здесь? Я уверен, что упускаю что-то очевидное. Я использую Strawberry Perl v5.16.3 в Windows 7 x64. Я редактирую в npp и выполняю свои скрипты из командной строки, через c:\strawberry> perl test.pl


person mic angelo    schedule 15.07.2013    source источник
comment
Из-за их особого значения для sort вы никогда не должны использовать $a и $b в своем коде в целом, даже не принимая во внимание обнаруженную вами разницу в поведении.   -  person DVK    schedule 16.07.2013
comment
Звучит как хорошая привычка, спасибо ДВК.   -  person mic angelo    schedule 16.07.2013


Ответы (2)


Некоторые глобальные переменные, такие как $_, $a, $b, фактически объявлены заранее. Поэтому переменные $a и $b можно использовать без дополнительных объявлений в блоке sort, где они имеют значения двух элементов:

use strict;
my @nums = (1, 5, 3, 10, 7);
my @sorted = sort { $a <=> $b } @nums
person amon    schedule 15.07.2013

Из документации strict:

Из-за специального использования функцией sort() переменные $a и $b исключены из этой проверки.

person toolic    schedule 15.07.2013
comment
Спасибо за ссылку! Очень полезно. - person mic angelo; 16.07.2013