Возможно ли вызвать функцию в qx?

#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