【问题标题】:How can I store Perl's system function output to a variable?如何将 Perl 的系统函数输出存储到变量中?
【发布时间】:2011-01-25 20:02:53
【问题描述】:

system 函数有问题。我想将系统函数输出存储到一个变量中。

例如,

system("ls");

这里我希望当前目录中的所有文件名都存储在一个变量中。我知道我可以通过将输出重定向到一个文件并从中读取并将其存储到一个变量来做到这一点。但我想要一个比这更有效的方法。有什么办法吗。

【问题讨论】:

  • 使用my $output = qx(ls 2>&1); 最后一部分是捕获stdout和stderr。

标签: perl system


【解决方案1】:

不,您不能存储 ls 输出的值, 由于系统始终将命令作为子进程执行, 所以尝试使用反引号 `command` 在当前执行命令 自己处理!

【讨论】:

  • @abubacker - 反引号确实执行了一个子进程。
  • 反引号在子进程中执行命令并捕获其输出。如果你想在同一个进程中执行命令,你可以使用exec - 但它永远不会返回,因为在将进程切换到另一个命令后,原始 Perl 代码不再运行。
  • 如何将命令的输出捕获到变量中而不显示在屏幕上?
【解决方案2】:

最简单的方法是使用反引号或qx()

my $value = qx(ls);
print $value;

输出类似于ls

【讨论】:

  • echo 是一个 shell 命令,Perl 等价物称为 printsay
  • 这适用于 ls,但不适用于 find 命令,因为我猜它的反引号 stackoverflow.com/questions/3854651/…
  • 请告知当“命令”包含一些 Perl 变量时的语法应该是什么,例如"ffmpeg -v error -i $file.mp4 -f null - 2>&1。谢谢。
【解决方案3】:

我的回答没有解决你的问题。但是,如果您真的想列出目录,请不要像这样调用系统ls。使用opendir()readdir()while 循环。

例如,

while (<*>){
    print $_ ."\n";
}

事实上,如果它不是第三方专有程序,请始终尝试使用 Perl 自己的函数。

【讨论】:

    【解决方案4】:

    内置 system 函数的官方 Perl 文档指出:

    这不是你想要的 捕获命令的输出,例如 你应该只使用反引号 或 qx//,如“STRING”中所述 佩洛普。

    有多种方法可以轻松访问文档:

    1. 在命令行:perldoc -f system
    2. 在线perldoc.perl.org
    3. 使用谷歌搜索网络。

    如果您希望将每个目录列表存储到一个单独的数组元素中,请使用:

    my @entries = qx(ls);
    

    【讨论】:

      【解决方案5】:

      正如 abubacker 所说,您可以使用反引号将程序的输出捕获到变量中以供以后使用。但是,如果您还需要检查异常返回值,或者绕过调用 shell,那么是时候引入 CPAN 模块了,IPC::System::Simple

      use IPC::System::Simple qw(capture);
      
      # Capture output into $result and throw exception on failure
      my $result = capture("some_command"); 
      

      该模块可以通过多种方式调用,并允许您自定义哪些错误返回值是“可接受的”,是否绕过 shell,以及如何处理参数分组。它还提供了对 system() 的直接替换,增加了更多的错误检查。

      【讨论】:

        【解决方案6】:

        一种快速简单的方法是使用qx() 专门用于您的示例:

        my $output = qx(ls 2&gt;&amp;1);

        2&gt;&amp;1 部分用于捕获标准输出和标准错误。

        【讨论】:

          【解决方案7】:

          使用反引号将输出存储在变量中

          $output = `ls`;
          

          【讨论】:

            【解决方案8】:

            由于其他答案尚未提及,您还可以使用 Capture::Tiny 将任意 STDOUT(和/或 STDERR)存储到变量中,包括来自系统命令。

            use strict;
            use warnings;
            use Capture::Tiny 'capture_stdout';
            my ($stdout, $return) = capture_stdout { system 'ls' };
            # error checking for system return value required here
            

            【讨论】:

              猜你喜欢
              • 2011-08-20
              • 2012-06-21
              • 2011-04-20
              • 2023-03-28
              • 2013-04-14
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2011-02-17
              相关资源
              最近更新 更多