【问题标题】:perl : can't require $value from other perl file and use it in 3rd perl fileperl : 不能从其他 perl 文件中要求 $value 并在第三个 perl 文件中使用它
【发布时间】:2019-04-30 08:41:09
【问题描述】:

所以我有 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"
}

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;

3.pl

use strict;
use warnings;

our $var;

print "3 : $var\n";

1;

我在终端打开 1.pl 时得到什么:

try : 3 : http://exemple.org
try : try :

而我想要得到的是:

try : 3 : http://exemple.org
try : 3 : http://test.org
try : 3 : http://perl.org

似乎 3.pl 的第二个要求不起作用,我该怎么办?

【问题讨论】:

  • 为什么设置如此复杂?您是否控制所有三个文件中的代码?这确实不是一个好主意。
  • 不,不是这样,这只是一个例子,我遇到的真正问题是一些大脚本

标签: perl require


【解决方案1】:

require keyword 将它已经加载的文件存储在 %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'
};

当您再次尝试require $same_filename 时,它会查看$INC{$same_filename}。如果存在,它将中止。

如果你想重新运行同一个文件,你可以使用 do 关键字代替,它只是加载和执行一个文件。这将每次从磁盘重新读取文件。

sub red {
    our $var;
    print "try : ";
    do "./3.pl"
}

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

【讨论】:

    猜你喜欢
    • 2012-12-01
    • 2019-12-20
    • 2015-04-08
    • 2020-12-15
    • 2012-04-30
    • 1970-01-01
    • 1970-01-01
    • 2011-12-28
    • 1970-01-01
    相关资源
    最近更新 更多