Perl, как передать массив в качестве аргумента другому скрипту Perl - PullRequest
1 голос
/ 17 октября 2019

У меня есть два сценария perl, где primary_script.pl будет вызывать сценарий secondary_script.pl, передавая массив в качестве аргумента.

Мой код показан ниже:
primary_script.pl

#!/usr/bin/perl

use Data::Dumper;
my @array = qw/1 2 3 4 5/;
print Dumper(\@array);

my $arr = \@array;

system("perl secondary_script.pl $arr") ;

print "END\n";


primary_script.pl

#!/usr/bin/perl

my @var = @{$ARGV[0]};
print @var."\n";

Я передаю ссылку на массив в качестве аргумента secondary_script.pl и оттуда разыменую этот массив. Здесь @var печатает 0 в результате вместо содержимого массива, которое было передано primary_script.pl.

Является ли это правильным способом передачи массива в качестве аргумента другому сценарию perl?

1 Ответ

5 голосов
/ 17 октября 2019

Вы можете просто передать аргументы, используя 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);
...