我正在编写两个perl脚本,它需要一个包含长字符串列表的数组 这里我想在一个单独的perl包中声明我的数组,并使用这个包在其他两个perl脚本中访问该数组
你能告诉我怎么能这样做
我检查了perl cpan模块导出器,但是可以发现它可以导出子程序,我只想要导出我的数组而不是任何子程序
提前谢谢你。
答案 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更清洁。 (注意,常量只是指定的简写。)