Ответ 1
Вы можете объявить глобальные переменные с помощью ключевого слова our
:
our $var = 42;
Каждая глобальная переменная имеет полное имя, которое можно использовать для доступа к ней из любого места. Полное имя - это имя пакета плюс имя переменной. Если вы еще не объявили пакет в этот момент, вы находитесь в пакете main
, который можно сократить до ведущего ::
. Таким образом, указанная выше переменная имеет имена
$var # inside package main
$main::var # This is most obvious
$::var # This may be a good compromise
Если бы мы использовали другой пакет, префикс изменился бы, например.
package Foo;
our $bar = "baz";
# $Foo::bar from anywhere,
# or even $::Foo::bar or $main::Foo::bar
Если мы хотим использовать переменную без префикса, но в других пакетах нам нужно экспортировать ее. Обычно это делается путем подклассификации Exporter
, см. Ответ @Davids. Тем не менее, это может предоставить только переменные из пакетов use
d, а не наоборот. Например.
Foo.pm
:
package Foo;
use strict; use warnings;
use parent 'Exporter'; # imports and subclasses Exporter
our $var = 42;
our $not_exported = "don't look at me";
our @EXPORT = qw($var); # put stuff here you want to export
# put vars into @EXPORT_OK that will be exported on request
1;
script.pl
:
#!/usr/bin/perl
# this is implicitly package main
use Foo; # imports $var
print "var = $var\n"; # access the variable without prefix
print "$Foo::not_exported\n"; # access non-exported var with full name
Лексические переменные (объявленные с помощью my
) не имеют глобально уникальных имен и не могут быть доступны за пределами их статической области. Они также не могут использоваться с Exporter
.