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 :(得分: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' - 这意味着你根本不丢弃不包含模式的元素。