perl:不能从其他perl文件中获取$ value并在第3个perl文件中使用它

Mob*_*yde 0 perl require

所以我有3个perl文件(1.pl,2.pl,3.pl),我想从2.pl中的循环中获取一个值并在3.pl中打印它

脚本

1.pl

use strict;
use warnings;

require "./2.pl";
sub red {
    our $var;
    print "try : ";
    require "./3.pl"
}
Run Code Online (Sandbox Code Playgroud)

2.pl

use strict;
use warnings;

my @array = ("http://exemple.org", "http://test.org","http://perl.org");

foreach our $var(@array){
    chomp ($var);
    red();
}

1;
Run Code Online (Sandbox Code Playgroud)

3.pl

use strict;
use warnings;

our $var;

print "3 : $var\n";

1;
Run Code Online (Sandbox Code Playgroud)

我在终端打开1.pl时得到的结果:

try : 3 : http://exemple.org
try : try :
Run Code Online (Sandbox Code Playgroud)

而我想得到的是:

try : 3 : http://exemple.org
try : 3 : http://test.org
try : 3 : http://perl.org
Run Code Online (Sandbox Code Playgroud)

看起来3.pl的第二个要求不起作用,所以我该怎么办?

sim*_*que 5

require关键字存储文件的它已经加载到%INC哈希值.

perl -MData::Dumper -E 'say Dumper \%INC'
$VAR1 = {
    'Data/Dumper.pm' => '/home/simbabque/perl5/perlbrew/perls/perl-5.26.1/lib/5.26.1/x86_64-linux/Data/Dumper.pm',
    'constant.pm' => '/home/simbabque/perl5/perlbrew/perls/perl-5.26.1/lib/5.26.1/constant.pm',
    'feature.pm' => '/home/simbabque/perl5/perlbrew/perls/perl-5.26.1/lib/5.26.1/feature.pm',
    'strict.pm' => '/home/simbabque/perl5/perlbrew/perls/perl-5.26.1/lib/5.26.1/strict.pm',
    'warnings/register.pm' => '/home/simbabque/perl5/perlbrew/perls/perl-5.26.1/lib/5.26.1/warnings/register.pm',
    'Exporter.pm' => '/home/simbabque/perl5/perlbrew/perls/perl-5.26.1/lib/5.26.1/Exporter.pm',
    'XSLoader.pm' => '/home/simbabque/perl5/perlbrew/perls/perl-5.26.1/lib/5.26.1/XSLoader.pm',
    'bytes.pm' => '/home/simbabque/perl5/perlbrew/perls/perl-5.26.1/lib/5.26.1/bytes.pm',
    'warnings.pm' => '/home/simbabque/perl5/perlbrew/perls/perl-5.26.1/lib/5.26.1/warnings.pm',
    'Carp.pm' => '/home/simbabque/perl5/perlbrew/perls/perl-5.26.1/lib/5.26.1/Carp.pm'
};
Run Code Online (Sandbox Code Playgroud)

当你require $same_filename再次尝试时,它将会看到$INC{$same_filename}.如果存在,它就会中止.

如果要重新运行同一个文件,可以使用do关键字,而只是加载并执行文件.这将每次从磁盘重新读取文件.

sub red {
    our $var;
    print "try : ";
    do "./3.pl"
}
Run Code Online (Sandbox Code Playgroud)

请记住,这是非常糟糕的做法.您应该将此代码移动到一个函数中并传递词法变量.