Никому не говорите, что я вам это говорил, но специальные переменные Perl доступны везде. Вы, наверное, заметили, что это не работает:
{ package Foo;
our $global = 42; }
{ package Bar;
say "global is $global"; }
Это потому, что $global на самом деле называется $Foo::global. Вы также, вероятно, заметили, что это «правило» не применяется к таким вещам, как @INC, %ENV, $_ и т. д. Это потому, что предполагается, что эти переменные всегда находятся в main.
Но на самом деле это больше, чем просто эти переменные. Весь глобус "загоняется" в main. Это означает, что вы можете написать что-то вроде этого:
{ package Constants;
$_{PI} = 3.141592; }
{ package Foo;
say "pi is $_{PI}"; }
и это будет работать.
(То же самое относится к $ENV, &INC и т. д.)
Однако, если вы когда-нибудь сделаете это в реальном коде, ожидайте, что кто-то вас убьет :) Однако это полезно знать, на случай, если вы увидите, что кто-то другой делает это.
person
jrockway
schedule
09.02.2009