如何在Perl数组或标量中存储git命令的输出?

时间:2016-04-08 23:51:30

标签: arrays git perl

在我的代码中我有

git diff --numstat

我知道我可以用

创建一个文件
git diff --numstat > log.log

但是甚至可以将它传递给某种数组或标量?我在想这样的事情,但我不确定为什么它不能编译。

my @array;
push (@array, git diff --numstat);

1 个答案:

答案 0 :(得分:1)

使用反引号,通常也称为qx//

  
      
  • qx/STRING/
  •   
  • `STRING`
      一个字符串(可能)被内插,然后作为带有/bin/sh或其等价物的系统命令执行。壳牌通配符,管道和重定向将受到尊重。返回收集的命令标准输出;标准错误不受影响。在标量上下文中,它作为单个(可能是多行)字符串返回,或者如果命令失败则返回undef。在列表上下文中,返回一个行列表(但是您已经定义了带有$/$INPUT_RECORD_SEPARATOR的行),如果命令失败,则返回一个空列表。
  •   

您有选项,哪个更好取决于您想要对输出做什么。

要将所有标准输出读入标量,请在标量上下文中使用运算符,如

$output = `git diff --numstat`;

在列表上下文中,默认值为$/,perl将输出拆分为单独的行。如果要将git输出附加到现有数组的末尾,请使用push,如

push @array, `git diff --numstat`;

虽然您在问题中特别提到push,但我很难想象为什么要将git的输出与其他内容混合起来。将输出直接存储在数组中更简单:

@array = `git diff --numstat`;

请注意,返回的行列表会保留其行尾字符。要创建一个新数组并删除一行中的所有换行符,请编写

chomp(@array = `git diff --numstat`);

甚至

chomp(my @array = `git diff --numstat`);

如果您在use strict下运行。

错误处理

对于计划使用多次或两次的代码,应检查`git diff --numstat`或您想要读取其输出的任何其他命令是否实际成功。否则,启用warnings编译指示后,您将看到许多有关未定义变量或缺少输出的诊断消息。

在标量上下文中,失败将返回未定义的值。请在

中查看
my $output = `git diff --numstat`;
die "$0: git may not be installed" unless defined $output;

列表上下文失败会产生一个空列表。

my @output = `git diff --numstat`;
die "$0: git may not be installed" unless @output;