将命令输出读入Perl数组

12

我想将命令的输出存储到一个数组中,就像这样:

my @output = `$cmd`;

但是看起来该命令的输出并没有进入 @output 数组。

有任何想法它去了哪里?


6
你确定你的命令会输出到标准输出(STDOUT)吗?如果它输出到标准错误(STDERR),那么在调用时需要添加 2>&1 才能捕获到输出。 - dgw
3
你是如何确定输出结果没有进入数组的? - Jonathan Leffler
3个回答

17

这个简单的脚本对我来说有效:

#!/usr/bin/env perl
use strict;
use warnings;

my $cmd = "ls";    
my @output = `$cmd`;    
chomp @output;

foreach my $line (@output)
{
    print "<<$line>>\n";
}

它产生了输出(三个点除外):

$ perl xx.pl
<<args>>
<<args.c>>
<<args.dSYM>>
<<atob.c>>
<<bp.pl>>
...
<<schwartz.pl>>
<<timer.c>>
<<timer.h>>
<<utf8reader.c>>
<<xx.pl>>
$

默认情况下,命令的输出按行界限进行分割(在列表上下文中)。chomp会删除数组元素中的换行符。


1
然后,您可能需要更清楚地向我们说明您的命令。我展示了$cmd赋值的内容,但您没有展示您正在执行的命令中包含的内容。您是否尝试过使用lspwdecho Hello World作为命令来查看是否会得到有用的返回结果?您还没有展示您如何处理数组。 - Jonathan Leffler

6
(标准)输出确实会进入那个数组:
david@cyberman:listing # cat > demo.pl
#!/usr/bin/perl
use strict;
use warnings;
use v5.14;
use Data::Dump qw/ddx/;

my @output = `ls -lh`;
ddx \@output;
david@cyberman:listing # touch a b c d
david@cyberman:listing # perl demo.pl
# demo.pl:8: [
#   "total 8\n",
#   "-rw-r--r--  1 david  staff     0B  5 Jun 12:15 a\n",
#   "-rw-r--r--  1 david  staff     0B  5 Jun 12:15 b\n",
#   "-rw-r--r--  1 david  staff     0B  5 Jun 12:15 c\n",
#   "-rw-r--r--  1 david  staff     0B  5 Jun 12:15 d\n",
#   "-rw-r--r--  1 david  staff   115B  5 Jun 12:15 demo.pl\n",
# ]

2

启用自动错误检查:

require IPC::System::Simple;
use autodie qw(:all);
⋮
my @output = `$cmd`;

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接