【问题标题】:How can I use system call in Perl without printing the result/output texts?如何在 Perl 中使用系统调用而不打印结果/输出文本?
【发布时间】:2013-02-13 06:39:16
【问题描述】:

我在 Windows XP 上使用 Cygwin Perl。

我有这段代码可以运行第三方程序。

sub main {
    print("Start Running\n");
    @return = run_exe($execApp, $parm1, $parm2);
    my $returncode = pop @return;
    if ($returncode == 0) {
        print("Success\n");
    }
    else {
        print("Error\n");
    }
}

sub run_exe {
    my ($exe, @parm) = @_;
    my (@output, @return_output);

    @output = system($exe, @parm);

    foreach (@output) {
        next if !/\S/;       # white space line
        s/^(\s*)//g;         # trim from the front for $_
        s/(\s*)$//g;         # trim from the end for $_
        push (@return_output, $_);
    }

    push (@return_output, $?>>8);
    @output = ();

    return (@return_output);
}

如果成功则打印:

Start Running
Return Code: 0
Success

我想要的不是打印运行 run_exe 子程序的输出(即返回代码:0):

Start Running
Success

我怎样才能做到这一点?请帮帮我,我在 Google 中搜索过,但什么也没找到。

【问题讨论】:

    标签: perl system


    【解决方案1】:

    你在你的程序中使用了system,它让你正在运行的程序打印到STDOUT并返回程序的退出状态(一个数字)。

    所以你现在拥有的东西没有意义,因为@output 将只包含一个数字,你不能将它解析为你正在运行的程序的输出。

    你可能需要的是反引号

    `$exe @parm`
    

    或者,更清楚地说,

    qx{$exe @parm}
    

    这将返回程序的输出,正如您所期望的那样,并避免将其打印到 STDOUT。

    请注意,您可能需要注意$exe@parm 的内容,因为生成的字符串必须在命令行中有效,并且字段可能需要适当地引用或转义。

    更新

    再次查看您的代码,您似乎可能期待来自system 的退出状态。但是把它放到一个数组中,遍历数组,提取非空白元素是非常复杂的!结果与您添加到返回数组的$? 的值相同。

    要转移程序的输出,您需要从命令外壳而不是直接运行它,因此要将输出发送到 Windows nul 设备,您的代码将如下所示

    system('cmd /C', $exe, @parm, '>nul');
    return $? >> 8;
    

    其实你也可以去掉子程序,换行

    @return = run_exe($execApp,$parm1,$parm2);
    my $returncode = pop @return;
    

    system('cmd /C', $execApp, $parm1, $parm2, '>nul');
    my $returncode = $? >> 8;
    

    【讨论】:

    • 我已经试过了,但是程序出错了。我真的不知道哪个是错的,是 $exe 还是 @parm。
    • 我写了一个更新,它保留了单独的参数。那应该对你有用。如果您想诊断qx 版本,请运行print "$exe @parm\n",以便您可以看到它正在构建的命令行。如果您仍然看不到错误,请在此处发布。
    • 顺便说一句,我忘了包括,我正在使用 cygwin perl。有关系吗?我有一个错误 - Can't exec "cmd /C": No such file or directory.
    • @quinekxi:这似乎很重要,但这意味着cmd.exe 不在PATH 上。如果你在命令提示符下输入cmd 会起作用吗?你从which cmd 得到什么?那个位置在 PATH 中吗?
    • 命令提示符中的 cmd 有效。当我将您的代码与 '>nul' 一起使用时,它可以工作,但是当我包含 '>nul' 时,$exe 出现返回代码错误:101。
    【解决方案2】:

    我今天刚遇到同样的问题,并记得我在很多很多脑细胞之前找到了解决方案(大约 4 年前的脑细胞价值)。在搜索了我的旧代码之后,我找到了解决方案。这里是。只需将您的系统调用放在反引号内,并附加“2>&1”。这是一个例子。

    我的 $results=nslookup -type=ns stackoverflow.com 2>&1;

    系统调用的结果分配给 $results,而不是打印出来。我不记得确切的原因或方式,但确实如此。

    这对我很重要,因为我经常在我的 PERL 编辑器中运行脚本,如果我允许大量打印(即,如果上述命令重复数千次),它将使用大量系统内存,最终是所有系统内存。

    我知道这是一个老话题,但希望它对下一个像今晚一样疯狂地在谷歌上搜索问题的解决方案的可怜、不幸的灵魂有价值。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-06-20
      • 1970-01-01
      • 2014-07-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多