Как Вы получаете stderr, stdout, и код выхода внезапно, в Perl?

Другое событие NullPointerException возникает, когда объявляется массив объектов, а затем сразу же пытается разыменовать его внутри.

String[] phrases = new String[10];
String keyPhrase = "Bird";
for(String phrase : phrases) {
    System.out.println(phrase.equals(keyPhrase));
}

Этот конкретный NPE можно избежать, если порядок сравнения отменяется ; а именно, использовать .equals для гарантированного непустого объекта.

Все элементы внутри массива инициализируются их общим начальным значением ; для любого типа массива объектов, это означает, что все элементы null.

Вы должны инициализировать элементы в массиве перед доступом или разыменованием их.

String[] phrases = new String[] {"The bird", "A bird", "My bird", "Bird"};
String keyPhrase = "Bird";
for(String phrase : phrases) {
    System.out.println(phrase.equals(keyPhrase));
}

56
задан DVK 10 May 2010 в 04:07
поделиться

5 ответов

Если Вы перечитываете документацию для IPC:: Open3, Вы будете видеть примечание, которое необходимо назвать waitpid для жатвы дочернего процесса. Как только Вы делаете это, состояние должно быть доступным в $?. Значение выхода $? >> 8. См. $? в perldoc perlvar.

26
ответ дан Sinan Ünür 26 November 2019 в 17:25
поделиться

( Обновление : Я обновил API для IO:: CaptureOutput для создания этого еще легче.)

существует несколько способов сделать это. Вот одна опция, с помощью IO:: модуль CaptureOutput :

use IO::CaptureOutput qw/capture_exec/;

my ($stdout, $stderr, $success, $exit_code) = capture_exec( @cmd );

Это - capture_exec () функция, но IO:: CaptureOutput также имеет более общее получение () функция, которая может использоваться для получения или вывода Perl или вывода из внешних программ. Таким образом, если некоторый модуль Perl, оказывается, использует некоторую внешнюю программу, Вы все еще получаете вывод.

Это также означает, что только необходимо помнить один единственный подход к получению STDOUT и STDERR (или слияние их) вместо того, чтобы использовать IPC:: Open3 для внешних программ и другие модули для получения Perl производятся.

41
ответ дан xdg 26 November 2019 в 17:25
поделиться

Если Вы не хотите содержание STDERR, то получение () управляет от IPC:: Система:: Простой модуль почти точно, что Вы после:

   use IPC::System::Simple qw(capture system $EXITVAL);

   my $output = capture($cmd, @args);

   my $exit_value = $EXITVAL;

можно использовать получение () с отдельным аргументом для вызова оболочки или нескольких аргументов для надежного предотвращения оболочки. Существует также capturex (), который никогда не называет оболочку, даже с отдельным аргументом.

В отличие от встроенной системы Perl и команд обратных галочек, IPC:: Система:: Простые возвраты полное 32-разрядное значение выхода в соответствии с Windows. Это также выдает подробное исключение, если команда не может быть запущена, умирает к сигналу или возвращает неожиданное значение выхода. Это означает для многих программ, вместо того, чтобы проверить значения выхода самостоятельно, можно положиться на IPC:: Система:: Простой сделать тяжелую работу для Вас:

 use IPC::System::Simple qw(system capture $EXIT_ANY);

 system( [0,1], "frobincate", @files);     # Must return exitval 0 or 1

 my @lines = capture($EXIT_ANY, "baznicate", @files);  # Any exitval is OK.

 foreach my $record (@lines) {
     system( [0, 32], "barnicate", $record);  # Must return exitval 0 or 32
 }

IPC:: Система:: Простой чистый Perl, не имеет никаких зависимостей и работает и над Unix и над системами Windows. К сожалению, это не дает возможность получения STDERR, таким образом, это не может подойти для всех Ваших потребностей.

IPC:: Run3 обеспечивает чистый и легкий интерфейс в переинфраструктуру всех трех общих дескрипторов файлов, но к сожалению это не проверяет, чтобы видеть, была ли команда успешна, таким образом, необходимо будет осмотреть $? вручную, который нисколько не забавен. Обеспечение открытого интерфейса для осмотра $? что-то, что находится на моем список ожидающих выполнения задач для IPC:: Система:: Простой, начиная с осмотра $? межплатформенным способом не задача, которой я пожелал бы на любом.

существуют другие модули в IPC:: пространство имен, которое может также предоставить Вам помощь. YMMV.

Всего самого лучшего,

Paul

14
ответ дан pjf 26 November 2019 в 17:25
поделиться

Существует три основных способа выполнить внешние команды:

system $cmd;        # using system()
$output = `$cmd`;       # using backticks (``)
open (PIPE, "cmd |");   # using open()

С system(), и STDOUT и STDERR пойдет то же место как сценарий STDOUT и STDERR,, если эти system() команда не перенаправляет их. Обратные галочки и open() только для чтения STDOUT из Вашей команды.

Вы могли также назвать что-то как следующее с открытым для перенаправления и STDOUT и STDERR.

open(PIPE, "cmd 2>&1 |");

код возврата всегда хранится в [1 111], как отмечено [1 112] @Michael Вагоновожатый .

7
ответ дан Community 26 November 2019 в 17:25
поделиться

Если Вы становитесь действительно сложными, Вы могли бы хотеть попробовать Expect.pm. Но это - вероятно, излишество, если Вы не должны также управлять входом отправки к процессу также.

0
ответ дан skiphoppy 26 November 2019 в 17:25
поделиться
Другие вопросы по тегам:

Похожие вопросы: