web-dev-qa-db-ja.com

Perl-含まれているすべてのスクリプトとモジュールで利用可能なグローバル変数?

それでは、main.plスクリプトがあり、そのスクリプトでいくつかの変数(任意の種類の変数定数または通常)を宣言する必要があり、それらの変数は、そこからインクルードするすべてのスクリプトおよびモジュールで使用できる必要があるとしましょうmain.plスクリプトを自動的に実行します。

$myVarに変数main.plがあり、main.plから変数がある場合、script1.plscript2.plまたはscript3.pmが必要です。特定のスクリプトまたはモジュールで定義された変数にアクセスするのと同じように、$myVarにアクセスする必要があるスクリプト。

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

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

どんな例でも、ドキュメントや記事は許容されます-基本的に私が達成するのを助けることができるものなら何でも役に立ちます。

16

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の回答を参照してください。ただし、これはusedであるパッケージからの変数のみを提供でき、その逆は提供できません。例えば。

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と一緒に使用することもできません。

35
amon

これを行う最も簡単な方法は、独自のモジュールを作成することです。したがって、たとえば、変数$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";

出力:

foo = 12
bar = 117.8
5
David