【问题标题】:Perl -> How return value of qx(perl file)Perl -> 如何返回 qx(perl 文件) 的值
【发布时间】:2013-09-07 12:57:00
【问题描述】:

我需要知道如何从其他 Perl 文件返回 Perl 文件的值。

在我的第一个文件中,我使用类似于以下语句的第二个文件调用:

$variable = qx( perl file2.pl --param1 $p1 --param2 $p2);

我已尝试退出并返回以获取此数据,但不可能。

有什么想法吗?

【问题讨论】:

  • 进程的“返回值”是什么意思?

标签: perl return-value qx


【解决方案1】:

进程不是子例程。

进程之间的通信(“IPC”)主要通过普通文件句柄完成。这样的文件句柄具体可以是

  • 标准输入和标准输出,
  • 由父进程设置的管道,然后由子进程共享,
  • 套接字

每个进程也有一个退出代码。此代码为零表示成功,非零表示失败。代码可以是 0–255 范围内的任何整数。可以通过exit 函数设置退出代码,例如exit(1),也由die设置。

使用 STDIN 和 STDOUT 是遵循Unix philosophy 的命令行程序的正常操作模式。这允许它们通过管道链接到更复杂的程序,例如

cat a b c | grep foo | sort >out

这样的工具可以在 Perl 中通过读取 ARGV 或 STDIN 文件句柄并打印到 STDOUT 来实现:

while (<>) {
  # do something with $_
  print $output;
}

然后另一个程序可以向该脚本提供数据,并从 STDOUT 读取它。我们可以使用open 将输出视为常规文件句柄:

use autodie;
open my $tool, "-|", "perl", "somescript.pl", "input-data"; # notice -| open mode
while (<$tool>) {
  ...
}
close $tool;

当你想要一个变量(标量或数组)中的所有输出时,你可以使用qx作为快捷方式:my $tool_output = qx/perl somescript.pl input-data/,但这有两个缺点:一是执行一个shell进程来解析命令(壳逃逸问题,效率低下)。第二,仅当命令完成时输出才可用。另一方面,使用open 可以进行并行计算。

【讨论】:

    【解决方案2】:

    file2.pl 中,您必须将print 的内容添加到STDOUT。例如:

    print "abc\n";
    

    【讨论】:

      【解决方案3】:

      打印是解决方案。

      对不起,我的白痴问题!

      【讨论】:

      • 应该是评论而不是答案
      【解决方案4】:

      #

       $variable = system( perl file2.pl --param1 $p1 --param2 $p2);
       #$variable has return value of perl file2.pl ...
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-08-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-01-07
        • 2019-10-31
        相关资源
        最近更新 更多