【问题标题】: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 中的那个模块