执行命令并将输出存储在数组变量中

时间:2015-03-03 12:22:45

标签: python perl popen

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代码一样以格式输出数组。

2 个答案:

答案 0 :(得分:2)

据我所知,您需要的只是

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

答案 1 :(得分:0)

我认为你在这里误解了几个perl概念。例如 - 你是split一个数组 - 这没有多大意义,因为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的每一行)上进行搜索和替换,但是替换表达式确实返回'true / false' - 这意味着你根本不丢弃不包含模式的元素。