2015-03-03 5 views
0
p = Popen(our_cmd, shell=True, stdout=PIPE, stderr=PIPE) 
output = p.communicate()[0] 
split = output.strip('\n\t\r').split("\n") 

Я хочу, чтобы выполнить эту команду, которая находится в строке our_cmdВыполнение команды и сохранение вывода в переменной массива

, что я пытался это

my @output = `$our_cmd`; ## here command is executing 
my @split = grep(s/\s*$//g, @output); ## the format and putting in new array 
@split = split("\n", @split); 

Моя команда выполняется, но не принимает входной сигнал должным образом. Мне нужен вывод в массиве в формате, как в коде Python.

+0

Возможный дубликат [Как вы захватываете stderr, stdout и код выхода одновременно, в Perl?] (Http://stackoverflow.com/questions/109124/how-do-you-capture-stderr- stdout-and-the-exit-code-all-at-once-in-perl) –

+0

Можете ли вы привести пример вывода, который вы обрабатываете? – Sobrique

+0

@AlessandroDaRugna: код возврата и содержимое 'stderr' игнорируются в этом коде Python – Borodin

ответ

2

Насколько я могу сказать от вашего вопроса, то все, что вам нужно, это

my @split = `$our_cmd`; 
chomp @split; 
+0

Я не был уверен в 'strip' - что похоже, что я удаляю некоторых персонажей? – Sobrique

+0

@Sobrique: он удаляет все вкладки, символы новой строки и каретки с начала и конца строки. В противном случае 'split' вернет пустую строку в конец. – Borodin

0

Я думаю, вы непонимание несколько концепций PERL здесь. Например, вы - split ing массив - это не имеет большого смысла, потому что split превращает строку в массив на основе разделителя.

Аналогичным образом grep - это довольно необычное использование grep, потому что у вас есть встроенный поиск и замена шаблона - обычно grep предназначен для фильтрации на основе некоторого булевского выражения. (Я подозреваю, что это работает так, но я не совсем уверен, вернет ли ваш шаблон замены true/false, что сделает нечетные вещи в контексте grep).

Так, как вместо того, чтобы:

my @output = `$our_command`; 

chomp @output; #removes linefeeds from each element. 

for (@output) { s/[\t\r]//g; }; #removes linefeeds and carriage returns 

Это поместит в @output один элемент в каждой строке (включая перевод строки), а затем удалите \t или \r там. Если вы не хотите перевода строки, как говорит Бородин, - chomp @output; справится с этим.

Как указано в комментариях - это может не точно воспроизвести то, что делает strip, а операция strip может быть неактуальной в perl.

Тестирование Grep:

my @test = ("test aaa bbb", "mooo", " aaa Moo MMOoo", "no thing in it"); 
print join ("\n", grep { s/aaa//g } @test); 

Это делает сделать поиск и замену на $_ (каждая строка grep), но заменить выражение не возвращать «истина/ложь» - фактически это означает, вам отбрасывать элементы, которые вообще не содержат шаблонов.

+1

Код Python удаляет только те символы из начала первой строки и конца последней строки вывода. В любом случае, никогда не должно быть никаких символов CR. – Borodin

Смежные вопросы