web-dev-qa-db-ja.com

2つの異なるPerlスクリプト間でグローバル変数を共有/エクスポートする方法は?

2つの異なるPerlスクリプト間でグローバル変数を共有またはエクスポートする方法を教えてください。

ここに状況があります:

first.pl

#!/usr/bin/Perl
use strict;
our (@a, @b);
.........

second.pl

#!/usr/bin/Perl
use strict;
require first.pl;

グローバル変数(@a@bfirst.plで宣言されています

また、最初のPerlファイルと同じ2番目のPerlファイルに変数があるとします。しかし、最初のファイルの変数を使用したいと思います。これを達成する方法は?

25
Cthar

一般に、複数のファイルで作業していて、それらの間で変数またはサブルーチンをインポートする場合、プロジェクトの成長に伴い、必要なファイルがやや複雑になることがわかります。これは、すべてが共通の名前空間を共有しているためですが、一部の変数は一部のファイルで宣言されており、他のファイルでは宣言されていません。

これがPerlで解決される通常の方法は、モジュールを作成してから、それらのモジュールからインポートすることです。この場合:

#!/usr/bin/Perl

package My::Module;  # saved as My/Module.pm
use strict;
use warnings;

use Exporter;
our @ISA = 'Exporter';
our @EXPORT = qw(@a @b);

our (@a, @b);

@a = 1..3;
@b = "a".."c";

そして、モジュールを使用するには:

#!/usr/bin/Perl

use strict;
use warnings;

use My::Module;  # imports / declares the two variables

print @a;
print @b;

そのuse行は実際には次のことを意味します:

BEGIN {
    require "My/Module.pm";
    My::Module->import();
}

importメソッドはExporterから派生しています。呼び出されると、@EXPORT配列を呼び出しコードに挿入します。

Exporter および perlmod のドキュメントを参照すると、開始点がわかります。

31
Eric Strom

はい、グローバル変数を共有します。何か問題がありますか?

例:

first.pl:

#!/usr/bin/Perl

use strict;
use warnings;

our (@a, @b);

@a = 1..3;
@b = "a".."c";

second.pl:

#!/usr/bin/Perl

use strict;
use warnings;

require "first.pl";

our (@a,@b);
print @a;
print @b;

与える:

$ Perl second.pl
123abc
18
ysth

パッケージを使用して変数をエクスポートできますか?

2
SAN