Для вашего конкретного примера вам не нужна переменная global .
Perl имеет переменных пакета .Они создаются с помощью our
, и к ним также можно получить доступ с помощью $namespace::
(где main
- пространство имен по умолчанию, и $::
также подходит для этого).Это global , но мы редко называем их так.
Вы должны иметь в виду, что our
создает лексический псевдоним, поэтому, если вы объявите его внутриподпрограмма, она не будет доступна снаружи, потому что в этой большей области нет лексического псевдонима.
use strict;
sub foo {
our $bar = 123;
}
foo();
print $bar; # error
Вам необходимо объявить переменную в большей области.
use strict;
our $bar;
sub foo {
$bar = 123;
}
foo();
print $bar;
Это будет работать, потому что $bar
теперь доступно в области видимости файла.
Все это применимо только при включенном use strict
.Если вы не объявите переменную, она автоматически станет переменной пакета.Однако, если вы включите строгий, вы должны объявить все переменные.Поэтому вам нужно быть явным.
Вы также можете использовать my
, если вы объявите это вне подпрограммы.
use strict;
my $bar;
sub foo {
$bar = 123;
}
foo();
print $bar;
Поскольку вы делаете это в сценарии, и нет явного объявления пакета, я думаю, можно с уверенностью предположить, что другие модули не задействованы.В этом случае не имеет значения, используете ли вы my
или our
.
Если вы используете это в пакете с другими файлами, это будет иметь значение.Переменные, объявленные в области видимости файла с my
, имеют вид private , поскольку нет прямого доступа к ним извне.
package Foo;
use strict;
my $bar = 123;
### other file
use Foo;
# no way to get $bar as there is no $Foo::bar
Но если вы используете our
(или устаревший use vars
) станет переменной пакета.
package Foo;
use strict;
our $bar = 123;
### other file
use Foo;
print $Foo::bar;
Можно ли объявить глобальные переменные в подпрограмме в Perl?
Да , вы можете объявить переменные пакета в подпрограмме с помощью our
.Но вы не можете получить к ним доступ как к лексическим переменным вне области, в которой они были объявлены, поэтому вам нужно получить к ним доступ с помощью их полного имени пакета, и это ужасно.