обратные кавычки в командной строке perl с матрицей

Я хочу перенести матрицу из одного файла perl в другой с помощью командной строки с обратными кавычками.

В первом файле perl, source.pl :

use warnings;
use strict;

my @matrix = (
    [1, 2, 3],
    [4, 5, 6],
    [7, 8, 9]
);

my $results = `perl other_file.pl @matrix`; #option 1
# my $results = `perl other_file.pl '@matrix'`; #option 2
print $results;

На other_file.pl

use strict
use warnings

my @matrix_other = $ARGV[0];
print "mat_adress = ".$matrix_other[1][2]."\n";

После запуска source.pl вывод терминала:

  • с опцией 1: sh: 1: Синтаксическая ошибка: "(" неожиданно
  • с опцией 2: нельзя использовать строку ("ARRAY(0x6c0cb8) ARRAY(0x6df410)"...) в качестве ссылки ARRAY, пока "строгие ссылки" используются в строке 5 other_file.pl.

Я также безуспешно пытался использовать символические ссылки в other_file.pl (вывод было: «Не ссылка на МАССИВ в other_file.pl»)

Есть идеи ? Большое спасибо.

PS: Нет проблем с простой переменной $var в командной строке;


person Poub    schedule 22.11.2014    source источник
comment
Вы не можете интерполировать двумерный массив в такую ​​строку. ARRAY(0x6c0cb8) — это ссылки на массивы, которые были преобразованы в строки. Также нельзя передать одну переменную в другую Perl-программу через такую ​​оболочку — если вы хотите этого, вам нужно соединить программы, использующие Perl.   -  person TLP    schedule 23.11.2014
comment
Так или иначе нужно рендерить, а потом парсить передавать в командной строке. Что-то вроде Storable может помочь?   -  person Sobrique    schedule 23.11.2014


Ответы (1)


Хорошо, довольно фундаментально - сделать то, что вы пытаетесь сделать напрямую, невозможно. Массив — это состояние памяти, и его неудобно упаковывать для передачи. Вот почему вы получаете такие вещи, как ARRAY(0x6c0cb8), потому что это адрес памяти, который занимает массив (или подэлементы).

Поэтому, как бы вы это ни делали, вам нужно будет сначала отобразить свой массив, а затем проанализировать его в своей подпрограмме.

Это достаточно большая тема, и ей посвящен целый раздел документации: perlipc

Подход сильно различается в зависимости от того, чего именно вы пытаетесь достичь. Что касается того, что вы пытаетесь сделать, моей первой мыслью было бы взглянуть на Storable:

use warnings;
use strict;

use Storable;

my @matrix = ( [ 1, 2, 3 ], [ 4, 5, 6 ], [ 7, 8, 9 ] );

my $tempfile = "matrix.$$";
store \@matrix, $tempfile;

my $results = `perl other_file.pl $tempfile`;    #option 1
print $results;

а в 'other_file' используйте retrieve:

use warnings;
use strict;
use Data::Dumper;

use Storable qw/retrieve/;

my ($filename) = @ARGV;

print Dumper retrieve($filename);

(Хотя вам, вероятно, следует использовать File::Temp, а не произвольные имена для временных файлов).

Однако взгляните на perlipc, в котором НАМНОГО больше информации о том, как передавать информацию туда и обратно.

person Sobrique    schedule 22.11.2014