Perl - глобальные переменные доступны во всех включенных скриптах и ​​модулях?

Так что скажем, что у меня есть main.pl script, и в этом script мне нужно объявить некоторые переменные (любые переменные константы или нормали), и эти переменные должны быть доступны через все сценарии и модули, которые я автоматически включится из этого main.pl script.

Что я имею в виду, если у меня есть переменная $myVar в main.pl и от main.pl мне требуется script1.pl, script2.pl или script3.pm, и из любого из этих сценариев мне нужно получить доступ к $myVar так как вы получите доступ к любому var, определенному в этом конкретном script или модуле.

Я искал в сети, но я нашел примеры, где вы можете получить доступ к переменным из сценариев, которые вы включаете, или извлекать переменные из модулей; но это не то, что я хочу.

Не существует ли ключевое слово, например, в PHP, где вы бы использовали global $var1, $var2 и т.д. для использования переменной из родительского script?

Любой пример, документация или статья приемлемы - в основном все, что могло бы помочь мне в этом, было бы полезно.

Ответ 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.

Ответ 2

Самый простой способ сделать это - создать собственный модуль. Например, если мне нужен глобальный доступ к переменным $foo and $bar, я мог бы создать модуль следующим образом:

# file:  MyVars.pm
package MyVars;

$foo = 12;
$bar = 117.8;

1;

Затем я могу получить доступ к этим переменным, используя любой perl script, который использует модуль MyVars:

# file:  printvars.pl
use MyVars;

print "foo = $MyVars::foo\nbar = $MyVars::bar\n";

Вывод:

foo = 12
bar = 117.8