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"
}
Имейте в виду, что это действительно плохая практика. Вы должны переместить этот код в функцию и передать лексические переменные.