perl: не может требовать $value из другого perl-файла и использовать его в 3-м perl-файле

Итак, у меня есть 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

Кажется, что 2-е требование 3.pl не работает, так что я могу сделать?

1 ответ

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'
};

Когда вы пытаетесь require $same_filename опять же посмотрим $INC{$same_filename}, Если это существует, оно прерывается.

Если вы хотите повторно запустить тот же файл, вы можете использовать do вместо ключевого слова, которое просто загружает и выполняет файл. Это будет перечитывать файл с диска каждый раз.

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

Имейте в виду, что это действительно плохая практика. Вы должны переместить этот код в функцию и передать лексические переменные.

Другие вопросы по тегам