Как я могу сохранить вывод системной функции Perl в переменную? - PullRequest
26 голосов
/ 10 марта 2010

У меня проблема с функцией system . Я хочу сохранить выходные данные системных функций в переменной.

Например,

system("ls");

Здесь я хочу, чтобы все имена файлов в текущем каталоге сохранялись в переменной. Я знаю, что могу сделать это, перенаправив вывод в файл, прочитать его и сохранить в переменной. Но я хочу эффективный способ, чем это. Есть ли способ.

Ответы [ 8 ]

19 голосов
/ 10 марта 2010

Нет, вы не можете сохранить значения вывода ls, поскольку система всегда выполняет команду как дочерний процесс, так что попробуйте с backtick `command`, который выполняет команду в текущем сам процесс!

15 голосов
/ 10 марта 2010

Самый простой способ - использование обратных кавычек или qx():

my $value = qx(ls);
print $value;

Вывод аналогичен ls.

10 голосов
/ 10 марта 2010

Мой ответ не касается вашей проблемы. Однако, если вы ДЕЙСТВИТЕЛЬНО хотите составить список каталогов, не называйте system ls вот так. Используйте opendir () , readdir () или цикл while.

Например,

while (<*>){
    print $_ ."\n";
}

На самом деле, если это не сторонняя проприетарная программа, всегда старайтесь использовать собственные функции Perl.

9 голосов
/ 10 марта 2010

Как заявил abubacker, вы можете использовать обратные пометки, чтобы записать вывод программы в переменную для последующего использования. Однако, если вам также нужно проверить исключительные возвращаемые значения или обойти вызов оболочки, самое время ввести модуль CPAN, IPC :: System :: Simple :

use IPC::System::Simple qw(capture);

# Capture output into $result and throw exception on failure
my $result = capture("some_command"); 

Этот модуль можно вызывать различными способами, и он позволяет настроить, какие возвращаемые значения ошибок являются «приемлемыми», обходить ли оболочку или нет, и как обрабатывать группировку аргументов. Он также предоставляет замену для system(), которая добавляет дополнительную проверку ошибок.

7 голосов
/ 10 марта 2010

Официальная документация Perl для встроенной системы Состояния функций:

Это не то, что вы хотите использовать для захватить вывод из команды, для что вы должны использовать только галочки или qx //, как описано в "STRING" в perlop.

Существует множество способов легкого доступа к документам:

  1. В командной строке: perldoc -f system
  2. Онлайн на perldoc.perl.org .
  3. Поиск в Интернете с помощью Google.

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

my @entries = qx(ls);
2 голосов
/ 03 февраля 2015

Использование обратных кавычек для сохранения вывода в переменной

$output = `ls`;
0 голосов
/ 28 января 2019

Так как он еще не был упомянут в других ответах, вы также можете использовать Capture :: Tiny для хранения любого произвольного STDOUT (и / или STDERR) в переменной, в том числе из системной команды.

use strict;
use warnings;
use Capture::Tiny 'capture_stdout';
my ($stdout, $return) = capture_stdout { system 'ls' };
# error checking for system return value required here
0 голосов
/ 27 сентября 2014

Быстрый и простой способ сделать это - использовать qx() специально для вашего примера:

my $output = qx(ls 2>&1);

Часть 2>&1 предназначена для захвата как stdout, так и stderr.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...