Как поделиться / экспортировать глобальную переменную между двумя разными скриптами perl? - PullRequest
24 голосов
/ 28 декабря 2010

Как мы можем совместно использовать или экспортировать глобальную переменную между двумя различными сценариями Perl.

Вот ситуация:

first.pl

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

second.pl

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

Я хочу использовать глобальную переменную (@a, @b), объявленную в first.pl

Также предположим, что во втором perl-файле есть переменная, такая же, как и в первом perl-файле. Но я хочу использовать переменную первого файла. Как этого добиться?

Ответы [ 3 ]

30 голосов
/ 28 декабря 2010

В целом, когда вы работаете с несколькими файлами и импортируете переменные или подпрограммы между ними, вы обнаружите, что требование к файлам становится немного сложнее по мере роста вашего проекта. Это происходит из-за того, что все разделяют общее пространство имен, но с некоторыми переменными, объявленными в некоторых файлах, но не в других.

Обычный способ решения этой проблемы в 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 должен дать вам отправную точку.

18 голосов
/ 28 декабря 2010

Они будут использовать глобальные переменные, да.Вы видите проблему с этим?

Пример:

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
2 голосов
/ 28 декабря 2010

Не можете ли вы использовать пакет и экспортировать переменную?

...