首页 > 解决方案 > 无法从 git pull 的输出创建数组

问题描述

use Cwd;
use strict;
use warnings;
no warnings 'numeric';


chdir("/root/dev/git_repo");

qx{git checkout master};
my $pull = qx{git pull};
if ($pull != "Already up-to-date."){
    my @output = $pull;
    chomp @output;
    foreach my $line (@output)
    {
        print "<<$line>>\n";
        }
    }

if ($pull == "Already up-to-date.")一切都很好,但是

if ($pull != "Already up-to-date."){

那么我将无法进入循环,我无法将输出正确转换为数组。我尝试了其他的东西,比如split /^/m, $pull.

我需要能够解析它才能获得我需要的文件。我不想使用任何外部库,因为我必须在未连接到 Internet 的旧服务器上使用此脚本。

标签: perl

解决方案


这是您的代码的简化版本:

use Cwd;
use strict;
use warnings;

chdir("/root/dev/git_repo");

qx{git checkout master};
my @lines = qx{git pull};
chomp @lines;

if ($lines[0] ne 'Already up-to-date.') {
    foreach my $line (@lines) {
        print "<<$line>>\n";
    }
}

您可以使用qx. 这消除了对多个变量的需要。


在我的系统上,qx{git pull}返回附加Already up-to-date.换行符 ( )。\n你的也可以。如果是这样,您的比较将失败。

!=仅用于数字比较,但您正在尝试进行字符串比较。您会收到一条警告消息,但您故意使用此行抑制了该警告:

no warnings 'numeric';

该警告告诉您,您的比较不会按预期进行。由于这是您的问题的主要来源,因此不要抑制该警告。Perl 警告几乎总是意味着您的代码中有错误。

您的代码的另一个问题是这一行:

my @output = $pull;

它用单个项目填充数组变量。它不会神奇地将git输出分成几行\n


推荐阅读