在另一个文件中使用一个perl文件的变量

时间:2014-02-13 13:17:07

标签: perl perl-module

我正在编写两个perl脚本,它需要一个包含长字符串列表的数组 这里我想在一个单独的perl包中声明我的数组,并使用这个包在其他两个perl脚本中访问该数组

你能告诉我怎么能这样做

我检查了perl cpan模块导出器,但是可以发现它可以导出子程序,我只想要导出我的数组而不是任何子程序

提前谢谢你。

3 个答案:

答案 0 :(得分:5)

Exporter可以处理任何包符号,无论是子例程还是变量:

package My::Package;
use parent 'Exporter';

our @EXPORT_OK = qw/@foo/;

our @foo = (42, 666);

然后:

use My::Package qw/@foo/;

print "@foo\n";

输出:42 666

但是,包变量(又称“全局”)是不受欢迎的。通常,面向对象等技术提供了更好的解决方案。如果你不想去那里,你仍然可以写一种“访问者”或“初始化者”:

package My::Package;

sub main {
  my @foo = (42, 666);
  return \@foo;
}

然后:

use My::Package;

my $foo = My::Package::main();
print "@$foo\n";

答案 1 :(得分:1)

您可以创建一个包变量并将其导出,就像子例程一样:

package Local::Foo;

use strict;
use warnings;
use Exporter qw(import);  # Allows you to export things

our @EXPORT = qw(@foo_array);

our @foo_array = ( ... );
1;

现在,您可以在程序中使用它:

my @local_array = @foo_array;

这真的叫做。非常糟糕的主意。变量在您不知情的情况下污染主程序的命名空间。另外,你可以改变@foo_array并破坏它的特殊含义。

如果你走这条路,不要做出口。只需通过包名称直接引用变量即可。毕竟,您已使用our声明了它:

package Local::Foo;

...

our @foo_array = ( ... );

而且,在您的计划中:

my @program_array = @Local::Foo::foo_array;

这稍微好一些。您将不会发生命名空间冲突,并且您知道该值的来源。但是,我会带领use constant使用子程序来定义常量。当你这样说:

use PI => 3.141529;

你真正在做的是:

sub PI {
    return 3.141529;
}

允许你这样做:

my $circumference = PI * ( 2 * $radius );

你可以对你的阵列采取类似的任务:

package Local::Foo;
use strict;
use warnings;

use Exporter qw(import);
our @EXPORT_OK = qw(foo_array);

sub foo_array {
    return qw( ... );
}

现在,在你的程序中使用它:

use Local::Foo qw(foo_array);

...

my @program_array - foo_array;

您可以访问foo_array的值,但根本无法更改它。它完全受到保护 - 一个恒定的价值。

答案 2 :(得分:0)

是的,我必须回应amon对出口的弃用。您可以将其创建为常量

package TheData;
use constant BIG_ARRAY => [ 0..300_000 ];

然后其他包可以引用它,就像它是一个静态成员一样:

package DataUser;

my $big_array_data = TheData->BIG_ARRAY;

更现代的Perl更清洁。 (注意,常量只是指定的简写。)