Perl中的BEGIN块

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

通过搜索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 { 打印这是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");