Perl中的BEGIN块
通过搜索Internet,我发现BEGIN块将在编译阶段得到评估和执行。但是@INC或其他变量可以被继承吗 下面是我为测试写的内容。目录结构如下所示:Perl中的BEGIN块,perl,Perl,通过搜索Internet,我发现BEGIN块将在编译阶段得到评估和执行。但是@INC或其他变量可以被继承吗 下面是我为测试写的内容。目录结构如下所示: |-- alexpackages | |-- alex1.pm | `-- alex2.pm |-- foo.pl `-- main.pl 对于每个文件: cat/alex1.pm 包alex1; sub-foo { 打印这是alex1::foo\n; } 1. cat/alex2.pm 包alex2; 次级方案2 { 打印这是alex
|-- alexpackages
| |-- alex1.pm
| `-- alex2.pm
|-- foo.pl
`-- main.pl
对于每个文件:
cat/alex1.pm
包alex1;
sub-foo
{
打印这是alex1::foo\n;
}
1.
cat/alex2.pm
包alex2;
次级方案2
{
打印这是alex2::foo2\n;
}
1.
猫食
alex1::foo;
cat main.pl
开始
{
push@INC,“~/programs/perl/alexpackages”;
}
严格使用;
使用警告;
使用alex1;
使用alex2;
alex1::foo;1.这个效果很好
systemperl foo.pl;2.这失败了
正如我的程序所说,@INC不适用于新的系统调用。在我看来,系统调用不会继承系统环境。我说得对吗
如何将环境变量设置为以下系统调用?以system启动的进程将从调用进程继承环境变量,但@INC只是一个全局Perl变量,而不是系统环境变量。它在Perl程序外部不可见
关于代码的几个注释
包名为globals,应该大写,因此您的包应该是alexpackages/Alex1.pm和alexpackages/Alex2.pm文件中的Alex1和Alex2
最好使用lib pragma来操纵@INC,所以
这是最好的。use语句会创建一个隐式的BEGIN块,所以这也是不必要的
在Perl子例程上使用原型是错误的,因此sub-foo应该只是sub-foo
您可能更喜欢使用将包的符号复制到调用代码中。这样,在调用子例程时就不必完全限定它的名称,比如foo而不是Alex1::foo
代码如下所示
main.pl
~/programs/perl/alexpackages/Alex1.pm
以system启动的进程将从调用进程继承环境变量,但@INC只是一个全局Perl变量,而不是系统环境变量。它在Perl程序外部不可见
关于代码的几个注释
包名为globals,应该大写,因此您的包应该是alexpackages/Alex1.pm和alexpackages/Alex2.pm文件中的Alex1和Alex2
最好使用lib pragma来操纵@INC,所以
这是最好的。use语句会创建一个隐式的BEGIN块,所以这也是不必要的
在Perl子例程上使用原型是错误的,因此sub-foo应该只是sub-foo
您可能更喜欢使用将包的符号复制到调用代码中。这样,在调用子例程时就不必完全限定它的名称,比如foo而不是Alex1::foo
代码如下所示
main.pl
~/programs/perl/alexpackages/Alex1.pm
有许多方法可以从Perl脚本或命令行中指定库搜索目录。要使另一个目录可用于使用系统调用的Perl脚本,可以做以下两件事:
PERL5LIB和-I开关都记录在中。有许多方法可以从Perl脚本或命令行中指定库搜索目录。要使另一个目录可用于使用系统调用的Perl脚本,可以做以下两件事:
PERL5LIB和-I开关都记录在中。您可以使用添加内容到@INC。您可以使用添加内容到@INC。我看到我的帖子回答了所问的特定问题,但没有提供传递@INC+1副本的解决方案。我看到我的帖子回答了所问的特定问题,但没有提供传递@INC副本的解决方案
use lib '~/programs/perl/alexpackages'
use strict;
use warnings;
use lib '~/programs/perl/alexpackages';
use Alex1;
foo();
package Alex1;
use strict;
use warnings;
use base 'Exporter';
our @EXPORT = qw/ foo /;
sub foo {
print "This is Alex1::foo\n";
}
1;
$ENV{PERL5LIB} = "~/programs/perl/alexpackages";
system("perl foo.pl");
system("perl -I~/programs/perl/alexpackages foo.pl");