Вызов одного файла из другого дает значение печати вместо возвращаемого значения в Perl - PullRequest
0 голосов
/ 03 октября 2019

Я могу выполнить один Perl-файл из другого Perl-файла, используя команду

`perl -X file-path -arguments=value`

, но это дает значение печати из файла, а не возвращаемое значение.

Это abc.pl:

my $a = `perl -X def.pl -num=4`;
print "here a is $a";

Это def.pl:

print "in def file";
my $xy = "hello world!";
return $xy;

Когда файл вызывается как perl -X abc.pl, я ожидаю, что результат будет

here a is hello world!

но я получаю

Can't return outside a subroutine at def.pl line 3.
here a is in def file

Как мне этого добиться?

Ответы [ 2 ]

2 голосов
/ 03 октября 2019

Когда вы используете `command` в Perl, результатом является стандартный вывод вызываемой команды. Это похоже на синтаксис, аналогичный оболочке.

Учитывая, что 'def.pl' является программой на perl, вы можете запустить ее непосредственно из abc.pl, используя 'require'. Однако 'def.pl' должен быть допустимой программой на Perl. Выполнение return $ xy за пределами функции приведет к появлению сообщения об ошибке: Невозможно вернуться за пределы подпрограммы в строке 1.

Рассмотреть возможность создания функции в def.pl, которая возвращает значение $ xy. ,Альтернативой, которая не является идеальной, является использование global.

# abc.pl
require 'def.pl' ;
my $a = xy() ;
print "here a is $a";


# def.pl
sub xy {
    my $xy = "..." ;
    return $xy ;
}

В качестве альтернативы, вы можете сделать def.pl «печатать» результат, позволяя получить «результат» из def. pl скрипт.

# def.pl
warn "in def file";
my $xy = "hello world!";
print $xy;
2 голосов
/ 03 октября 2019

-X подавляет предупреждения. Не подавляйте их, они дают подсказку, почему код не соответствует вашим ожиданиям.

Вы должны использовать подпрограммы и библиотеки.

def.pl

sub hello {
    print "in def file\n";
    my $xy = "hello world!";
    return $xy;
}
1;

abc.pl

require './def.pl';
my $a = hello();
print "here a is $a";

Следующим шагом здесь является организация вашего кода в виде модулей. .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...