2013-05-09 2 views
12

Итак, скажем, у меня есть сценарий main.pl, и в этом скрипте мне нужно объявить некоторые переменные (любые переменные константы или нормальные), и эти переменные должны быть доступны через все сценарии и модули, которые я буду включать из этого сценария main.pl автоматически.Perl - Глобальные переменные доступны во всех включенных сценариях и модулях?

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

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

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

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

ответ

29

Вы можете объявить глобальные переменные с 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.

+0

После некоторого размышления я переключился на этот метод, так что спасибо: D –

+0

$ :: сделает трюк – yanger

5

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

# file: MyVars.pm 
package MyVars; 

$foo = 12; 
$bar = 117.8; 

1; 

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

# file: printvars.pl 
use MyVars; 

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

Выход:

foo = 12 
bar = 117.8 
+0

Примечание: '@ EXPORT_OK' определяет символы, которые будут экспортироваться по запросу; вы ничего не просите. Используя полностью квалифицированные имена, вам даже не нужен «Экспортер»: ваш пример будет работать со всеми линиями, связанными с экспортером. – amon

+0

@amon Получил это. Благодарю. – David