Reading output from command into Perl array

2019-01-27 18:51发布

问题:

I want to get the output of a command into an array — like this:

my @output = `$cmd`;

but it seems that the output from the command does not go into the @output array.

Any idea where it does go?

回答1:

This simple script works for me:

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

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

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

It produced the output (except for the triple dots):

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

The output of command is split on line boundaries (by default, in list context). The chomp deletes the newlines in the array elements.



回答2:

The (standard) output does go to that array:

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",
# ]


回答3:

Enable automatic error checks:

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


标签: perl command