perl: не может требовать $ value из другого файла perl и использовать его в третьем файле perl - PullRequest
0 голосов
/ 28 ноября 2018

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

0 голосов
/ 28 ноября 2018

Ключевое слово 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"
}

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

...