[英]BEGIN blocks in Perl
搜索Internet,我发现BEGIN块将在编译阶段进行评估和执行。 但是@INC或其他变量可以继承吗?
以下是我为测试编写的内容。 目录结构为:
|-- alexpackages
| |-- alex1.pm
| `-- alex2.pm
|-- foo.pl
`-- main.pl
对于每个文件:
猫alexpackages / alex1.pm
package alex1;
sub foo()
{
print "this is alex1::foo\n";
}
1;
猫alexpackages / alex2.pm
package alex2;
sub foo2()
{
print "this is is alex2::foo2\n";
}
1;
猫foo.pl
alex1::foo();
猫main.pl
BEGIN
{
push(@INC, '~/programs/perl/alexpackages');
}
use strict;
use warnings;
use alex1;
use alex2;
#alex1::foo(); # 1. This works good
system("perl foo.pl"); # 2. This fails
就像我的程序告诉@INC不适用于新的系统调用一样。 在我看来,系统调用不会继承系统环境。 我对吗?
以及如何将环境变量设置为以下系统调用?
流程开始system
将继承调用进程的环境变量,但@INC
仅仅是一个全球性的Perl变量,而不是一个系统环境变量。 在Perl程序外部不可见。
关于代码的一些注意事项
包名,是全局,予以资本化,所以你的包应该是Alex1
和Alex2
,在文件alexpackages/Alex1.pm
和alexpackages/Alex2.pm
最好使用lib
编译指示来操作@INC
,因此
use lib '~/programs/perl/alexpackages'
是最好的。 并且一条use
语句创建一个隐式的BEGIN
块,因此这也是不必要的。
在Perl子例程上使用原型是错误的,因此sub foo()
应该只是sub foo
您可能更喜欢使用Exporter
将包的符号复制到调用代码中。 这样,您不必在调用子例程名称时就完全限定其名称,例如foo()
而不是Alex1::foo()
代码看起来像这样
main.pl
use strict;
use warnings;
use lib '~/programs/perl/alexpackages';
use Alex1;
foo();
〜/ programs / perl / alexpackages / Alex1.pm
package Alex1;
use strict;
use warnings;
use base 'Exporter';
our @EXPORT = qw/ foo /;
sub foo {
print "This is Alex1::foo\n";
}
1;
有很多方法可以从Perl脚本或命令行中指定库搜索目录。 您可以执行以下两项操作来使另一个目录可用于您使用system
调用的Perl脚本:
$ENV{PERL5LIB} = "~/programs/perl/alexpackages";
system("perl foo.pl");
system("perl -I~/programs/perl/alexpackages foo.pl");
PERL5LIB
中记录了perlrun
和-I
开关。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.