Вызовите функцию командной строки в Perl и получите вывод в виде String

Каков наилучший / самый простой способ выполнить функцию командной строки в Perl, чтобы я мог получить вывод в виде строки?

Что я на самом деле пытаюсь сделать, так это вызвать Java-программу из функции PL/Perl в PostgreSQL, и я хочу получить выходную строку, однако в данный момент она просто возвращает 0.

Вот простой кусок кода, чтобы объяснить, что я после:

CREATE OR REPLACE FUNCTION perl_func()
  RETURNS character varying AS
$BODY$    
  return system("java -version");
$BODY$
  LANGUAGE plperlu VOLATILE
  COST 100;

1 ответ

Решение

Вы можете использовать backticks. Цитировать из perldoc perlop:

* QX / STRING /

* `STRING`

Строка, которая (возможно) интерполируется и затем выполняется как системная команда с /bin/sh или ее эквивалентом. Подстановочные знаки, трубы и перенаправления будут выполнены. Собранный стандартный вывод команды возвращается; стандартная ошибка не изменяется В скалярном контексте он возвращается как одна (потенциально многострочная) строка или undef, если команда не выполнена. В контексте списка возвращает список строк (однако вы определили строки с помощью $/ или $INPUT_RECORD_SEPARATOR) или пустой список, если команда не выполнена.

Вы не можете использовать system для этого, поскольку он просто возвращает возвращаемое значение аргумента (при запуске в качестве команды оболочки). Это должно работать:

CREATE OR REPLACE FUNCTION perl_func()
  RETURNS character varying AS
$BODY$
  my $output=`java -version`;
  chomp($output);
  return $output;
$BODY$
  LANGUAGE plperlu VOLATILE
  COST 100;

Обратите внимание, что выходные данные команды с обратным символом обычно включают завершающий символ новой строки, поэтому часто бывает полезно избавиться от этого с помощью chomp,

Другие вопросы по тегам