【问题标题】:Reading output from command into Perl array将命令的输出读入 Perl 数组
【发布时间】:2012-06-05 11:10:30
【问题描述】:

我想把一个命令的输出放到一个数组中——像这样:

my @output = `$cmd`;

但该命令的输出似乎没有进入@output 数组。

知道它的去向吗?

【问题讨论】:

  • 您确定您的命令写入 STDOUT 吗?如果它写入 STDERR,则反引号不会在不将 2>&1 附加到您的呼叫的情况下捕获它。
  • 你如何确定输出没有进入数组?

标签: perl command


【解决方案1】:

这个简单的脚本适合我:

#!/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 删除数组元素中的换行符。

【讨论】:

  • 那么您可能需要更清楚地向我们表明您的命令。我向$cmd展示了作业;您没有显示您正在执行的命令中的内容。您是否尝试过使用lspwdecho Hello World 作为命令来查看您是否得到有用的东西?你也没有展示你是如何处理数组的。
【解决方案2】:

(标准)输出确实会进入该数组:

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】:

    启用自动错误检查:

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

    【讨论】:

      猜你喜欢
      • 2012-07-10
      • 2013-12-26
      • 2023-03-11
      • 2018-07-16
      • 1970-01-01
      • 2011-12-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多