#perl #qx
#perl #qx
Вопрос:
Вот немного кода Perl, который делает то, что я хочу:
my $value = get_value();
my $result = qx(some-shell-command $value);
sub get_value {
...
return ...
}
Можно ли добиться того же эффекта без использования $value
? Что-то вроде
my $result = qx (some-shell-command . ' '. get_value());
Я знаю, почему второй подход не работает, это просто для демонстрации идеи.
Ответ №1:
my $result = qx(some-shell-command @{[ get_value() ]});
# or dereferencing single scalar value
# (last one from get_value if it returns more than one)
my $result = qx(some-shell-command ${ get_value() });
но я бы предпочел использовать ваш первый вариант.
Объяснение: массивы perl интерполируют внутри ""
, и т.д. qx()
Выше приведена ссылка на массив []
, содержащая результат функции, разыменовывается @{}
и интерполируется внутри qx()
.
Комментарии:
1. Спасибо за умное решение. Я с вами, хотя я все равно буду использовать $value .
2. Работает ли это, потому
qx
что ожидаетсяSTDIN
, что это будет список? Но даже еслиget_value()
возвращает СПИСОК, нам все равно нужен[ ]
(анонимный список / массив), который мы затем разыменовываем, чтобы передать первому элементуqx
… Зачем нужен этот шаг? Этот синтаксис каким-то образом превращает все в один список внутриqx
разделителей?3.@G.Cito
perl -e 'print qx( echo @{[ 3..7 ]} )'
qx
принимает строку и@{}
интерполирует упомянутый массив.4. ах, хорошо, конечно, это необходимо для интерполяции всего, что есть в списке массивов anon. Другими словами: это пример
@{[ ]}
оператора интерполяции списка or «Babycart» в действии! 1 Спасибо за объяснение 🙂5. @salva tnx для комментариев.
Ответ №2:
Обратные ссылки и эквивалентны qx
встроенной readpipe
функции, поэтому вы можете явно использовать это:
$result = readpipe("some-shell-command " . get_value());
Комментарии:
1. Круто, узнал что-то новое. В основном старайтесь использовать чистые решения на perl вместо того, чтобы выкладывать вещи, но это приятно знать. 1