【问题标题】:how to get text via backticks or system in Perl如何通过 Perl 中的反引号或系统获取文本
【发布时间】:2012-02-06 08:16:50
【问题描述】:

我想在 Perl 中调用一个执行某些操作的 EXE 文件

我尝试通过 backticksystem 调用 exe 文件,但在这两种情况下我都只得到返回值

exe 文件在控制台上打印一些文本。是否也可以捕捉到这一点?

我查看了这个变量${^CHILD_ERROR_NATIVE},但我只得到返回值而不是文本

我正在使用 Perl 5.14

提前致谢

【问题讨论】:

    标签: perl backticks


    【解决方案1】:

    应用程序可能不会将其输出打印到STDOUT,而是打印到STDERR,这不会被反引号运算符捕获。要同时捕获两者,您可以使用以下命令:

    my $binary = 'foo.exe';
    my $output = `$binary 2>&1`;
    

    要进行更精细的捕获,您可能需要使用 IPC::Open3 来“控制”所有进程的流(INOUTERR)。

    【讨论】:

    • 真的吗?然后我撤回我的评论。
    【解决方案2】:

    我曾经从 perl 脚本执行命令并以这种方式捕获输出

    sub execute_command() {
      my($host) = @_;
      open(COMMAND_IN, "your_command |"); 
      while (<COMMAND_IN>) 
      { #The COMMAND_IN will have the output of the command
        #Read the output of your command here...
        $ans = $_;
      }
      close(COMMAND_IN);
      return $ans;
    }
    

    检查它是否对你有帮助

    【讨论】:

      【解决方案3】:

      我推荐Scriptalicious 中的capturecapture_err 函数。

      use Scriptalicious qw(capture);
      
      my $output = capture('my_command', 'arg');
      

      【讨论】:

      • 该模块已有四年历史 (use 5.006) 并将所有内容导出到调用命名空间 (@EXPORT)。将此模块与更现代的 perl 版本一起使用时可能会出现一些问题(重新定义 say f.ex.)。
      • 虽然它很旧,但该模块运行良好。您可能应该明确导入您需要的功能。我添加了一个执行此操作的示例。
      猜你喜欢
      • 2014-01-21
      • 1970-01-01
      • 1970-01-01
      • 2020-03-07
      • 2023-03-23
      • 2018-01-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多