Подтвердить что ты не робот

Как я могу сохранить вывод системной функции Perl в переменную?

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

Например,

system("ls");

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

4b9b3361

Ответ 1

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

Ответ 2

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

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

Вывод похож на ls.

Ответ 3

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

Например,

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

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

Ответ 4

Как сказано в заявлении 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(), которая добавляет дополнительную проверку ошибок.

Ответ 5

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

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

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

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

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

my @entries = qx(ls);

Ответ 6

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

$output = `ls`;

Ответ 7

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

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

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

Ответ 8

Так как другие ответы еще не были упомянуты, вы также можете использовать 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