Вы можете просто передать аргументы, используя system
в форме списка:
system $^X, $program_name, @array;
Форма списка обходит оболочку, поэтому она не интерпретирует метасимволы из ваших аргументов (например, ;
)и &
в оболочке).
$^X
- это путь к perl, который в данный момент выполняется, скорее всего, тот, который вам нужен, вместо того, чтобы искать в PATH снова.
ТамЕсть сложности, чтобы вторая программа интерпретировала ваши аргументы так, как вы хотите. Я расскажу о некоторых из них в «1012», цитируя «Оболочку» .
. Вам нужно больше рассказать о том, что вы пытаетесь сделать, чтобы получить лучший совет.
Назад к вашим программам
Давайте рассмотрим еще несколько вещей в ваших программах.
В _secondary_script.pl_ вы пытаетесь разыменовать список аргументов. Но @ARGV
- это простой именованный массив. Вам не нужно разыменовывать это. Вы можете написать:
print "@ARGV\n";
Помещение списка аргументов в двойные кавычки интерполирует его, помещая пробелы между элементами. Таким образом, вы не будете разыгрывать трюки со ссылками.
Если вы пытаетесь передать сложные данные, а не простые аргументы, вы могли бы рассмотреть какой-то вид сериализации (JSON, Sereal и т. Д.) И вывод в стандартный формат. вывод и чтение со стандартного ввода:
use Data::Dumper;
my @array = qw/1 2 3 4 5/;
print Dumper(\@array);
Затем в другой программе:
my $input = do { local $/; <STDIN> };
my $array = eval $input;
Эта строка eval
немного опасна (и , как и Perl Storable
), но это идея. Возьмите какой-нибудь текст и рассмотрите его.
Данные конвейера
Затем вы объедините эти программы в конвейер:
$ perl first.pl | perl second.pl
Но вы также можете печатать непосредственно во второй программе, открыв канал изпервый:
use Data::Dumper;
my @array = qw/1 2 3 4 5/;
open my $pipe, '|-', $^X, $other_program;
print {$pipe} Dumper(\@array);