2015-01-30 3 views
-1

У меня есть следующий Perl скрипт:Установить массив оболочки из массива в сценарии Perl

sub { 
    my $sequence="SEQUENCE1"; 
    my $sequence2="SEQUENCE2"; 
    my @Array = ($sequence, $sequence2); 
    return \@Array; 
} 
-1 

Я хочу, чтобы получить значение массива с помощью сценария Баша

#!/bin/bash 
seq=$(perl vectTEST.pl) 
# retrieve the column 1 of the Array  
echo $seq[0] 

Моего подхода Безразлично Не работай.

+3

* «Это не работает» * на самом деле ничего не значит для нас; если вы можете детализировать, может быть, мы сможем помочь лучше :) – m0skit0

+0

@ikegami Я не уменьшал или не закрывал голос anyawy – m0skit0

+0

В этом случае это означает «Я не знаю, как это сделать». В этом ответе нет ничего, что гарантирует его закрытие. [oops, re-posting случайно удаленный комментарий] – ikegami

ответ

2

Вы можете сделать это, но вам нужно изменить vectTEST.pl - в настоящее время у вас есть анонимный субтитр, который вы ничего не назначаете. Измените сценарий PERL на:

$vect = sub { 
    my $sequence="SEQUENCE1"; 
    my $sequence2="SEQUENCE2"; 
    my @Array=(); 
    push(@Array,$sequence,$sequence2); 
    return \@Array; 
}; 
1; 

Затем, вы можете сделать это в Баш:

mapfile -t seq < <(perl -E 'do "vectTEST.pl"; say join "\n", @{$vect->()}') 
for idx in "${!seq[@]}"; do echo "$idx ${seq[idx]}"; done 
0 SEQUENCE1 
1 SEQUENCE2 
3

Вы не можете вернуть массив. Концепция не имеет смысла, поскольку print создает поток байтов, а не переменные.


Одним из решений является вывод текстового представления массива и его синтаксический анализ.

Например,

$ IFS=$'\n' array=($(
    perl -e' 
     my @array = ("a b", "c d", "e f"); 
     print "$_\n" for @array; 
    ' 
)) 

$ echo ${#array[@]} 
3 

$ echo "${array[1]}" 
c d 

Эта конкретная реализация предполагает ваш массив не может содержать символы перевода строки.


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

Например,

$ eval "array=($(
    perl -e' 
     use String::ShellQuote qw(shell_quote); 
     my @array = ("a b", "c d", "e f"); 
     print join " ", map shell_quote($_), @array; 
    ' 
))" 

$ echo ${#array[@]} 
3 

$ echo "${array[1]}" 
c d 

Это надежное решение.

+1

@Ben Grimm, Спасибо: D – ikegami

1

Вы проверили свой скрипт на Perl? Для того, чтобы иметь этот сценарий Perl дать вам то, чтобы поместить в сценарий оболочки, вы убедитесь, что ваш сценарий Perl работает:

$ test.pl 

Нет вывода на всех.

В первую очередь вы помещаете весь скрипт Perl в sub. Подпрограммы в Perl не выполняются, если вы их не назовете. Вы даже не можете этого сделать, поскольку ваша подпрограмма даже не имеет имени. Давайте избавиться от подпрограммы:

my $sequence="SEQUENCE1"; 
my $sequence2="SEQUENCE2"; 
my @Array = ($sequence, $sequence2); 
print \@Array . "\n"; 

Хорошо, теперь давайте попробуем программу:

$ test.pl 
ARRAY(0x7f8bab8303e0) 

Вы распечатывания ссылку на массив с этой \ в передней части @Array.Давайте распечатать сам массив:

my $sequence="SEQUENCE1"; 
my $sequence2="SEQUENCE2"; 
my @Array = ($sequence, $sequence2); 
print @Array, "\n"; 

Что теперь будет печатать @Array:

$ test.pl 
SEQUENCE1SEQUENCE2 

не совсем. Между каждым элементом нет пробелов. Зададим $, который является выходной разделитель полей быть единым пространством:

my $sequence="SEQUENCE1"; 
my $sequence2="SEQUENCE2"; 
my @Array = ($sequence, $sequence2); 
$,=' '; 
print @Array, "\n"; 

Сейчас:

$ test.pl 
SEQUENCE1 SEQUENCE2 

Теперь мы имеем программу, работающую на Perl, который выдает то, что нам нужно поместить в ваш массив раковин:

seq=($(test.pl)) 
echo ${seq[*]} 
SEQUENCE1 SEQUENCE2 

Если у вас есть проблема, вам нужно разбить ее на кусочки. Ваша первая проблема заключается в том, что ваш скрипт Perl не работал. Как только это исправлено, вы можете использовать его для инициализации своего массива в своей оболочке Bash.

+0

Примечание: Это произойдет, если последовательности имеют пробелы. – ikegami

+1

Что с помощью '$,'? 'print join '', @Array," \ n ";' было бы лучше, хотя вы могли бы просто использовать 'print '@Array \ n"; 'здесь – ikegami

+0

Спасибо, ребята, я буду проверять ваши предложения в понедельник :) –

Смежные вопросы