2013-05-09 5 views
12

私はmain.plスクリプトを持っていて、そのスクリプトではいくつかの変数(変数の定数や標準の種類)を宣言する必要があり、それらの変数はすべてmain.plスクリプトからインクルードするすべてのスクリプトとモジュールで利用可能である必要があります自動的に。私はmain.plで変数$myVarを持っているとmain.plから、私はscript1.plscript2.plまたはscript3.pm、と私はあなたがその特定のスクリプトやモジュールで定義された任意のVARにアクセスするよう$myVarにアクセスする必要がこれらのスクリプトの誰からも必要とする場合、私は何を意味 Perl - 含まれているすべてのスクリプトとモジュールで使用できるグローバル変数?

私はネットで検索しましたが、モジュールから変数を取り込むか、変数を抽出するスクリプトから変数にアクセスできる例しか見つかりませんでした。それは私が望むものではありません。

親スクリプトの変数を使用するのに、global $var1, $var2などを使用するPHPのようなキーワードはありませんか?

すべての例、ドキュメント、または記事が受け入れられます。基本的には、達成するのに役立つものは参考になります。

答えて

29

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 answerを参照してください。しかし、これは、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; 

は、その後、私はMyVarsモジュールを使用するすべてのperlスクリプトを使用して、これらの変数にアクセスすることができます

# file: printvars.pl 
use MyVars; 

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

出力:あなたはourキーワードでグローバル変数を宣言することができます

foo = 12 
bar = 117.8 
+0

注: '@ EXPORT_OK'は、要求時にエクスポートされるシンボルを定義します。あなたは誰も要求しない。完全修飾名を使用することで、「Exporter」は不要です。Exporter関連のすべての行が削除された例があります。 – amon

+0

@amonありがとう。 – David

関連する問題