【问题标题】:How to get the variable from a perl script that is called within a perl script?如何从 perl 脚本中调用的 perl 脚本中获取变量?
【发布时间】:2012-06-21 19:08:13
【问题描述】:

我有两个 perl 脚本 a.pl 和 b.pl

在a.pl中,它通过system("/usr/bin/perl ./b.pl");

调用b.pl

在 b.pl 中,它会做一些事情,然后将一些值分配给 $aa 和 $bb

现在在 a.pl 中调用 b.pl 后,a.pl 需要 $aa 和 $bb 的值来自 b.pl。

我做了研究,发现有人说要使用“导出器”或在 b.pl

中将 $aa 和 $bb 设置为 $ENV

但是经过一些尝试,我没能做到。

有人可以帮忙吗?谢谢。

【问题讨论】:

    标签: perl export environment-variables


    【解决方案1】:

    当您通过system 调用它时,您调用的是一个子进程。您无法通过管道(例如标准输出)从中获取任何内容。

    你可能想要的是do './b.pl;反而。更好的是,把 b.pl 放到 b.pm 中,设置它的包,然后你就可以require b; 并通过它的包访问它的全局变量。

    【讨论】:

      【解决方案2】:

      如果您出于某种原因需要将这作为两个应用程序而不是do、use 或require 应用程序中的另一个 perl 脚本,那么您可以从 b.pl 打印结果强>到标准输出

      print join('|', $aa, $bb);
      

      然后在 a.pl 中读取并拆分它

      my ($aa, $bb) = split(/\|/, `/usr/bin/perl ./b.pl`);
      

      如果您的$aa 或$bb 可能包含字符|,请选择不同的分隔符。

      【讨论】:

        【解决方案3】:

        如果 b.pl 是在没有本地声明的变量的情况下编写的(所以不使用警告,使用严格,不使用我的 $aa),您可以将文件读入变量并对其进行评估。否则,如果不修改 b.pl,这将是不可能的。一些可能的事情:

        • 使用 ENV(如前所述)
        • 在 b.pl 退出前在 STDOUT 上打印 $aa 和 $bb,读取 a.pl 中的内容
        • 使用一些众所周知的IPC 方法(管道、套接字、临时文件)
        • 将 b.pl 的逻辑移动到某个单独的模块中,包括 b.pl 和 a.pl 中的那个模块

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2010-09-26
          • 1970-01-01
          • 2023-03-17
          • 1970-01-01
          • 2012-03-10
          相关资源
          最近更新 更多