如何制作一个 perl 脚本 运行 另一个 perl 脚本?

How do I make a perl script run another perl script?

我正在编写一个大型 Perl 脚本,它需要利用其他现有的 Perl 脚本。问题是主脚本需要引用来自不同文件夹的许多不同脚本。例如,主脚本将包含在:

/perl/programs/io 

它可能需要 运行 一个存储在以下位置的脚本:

/perl/programs/tools 

请注意,除了 tools 之外还有其他正交文件夹,因此我需要能够即时访问其中的任何文件夹。

目前我得到的是:

my $mynumber = '../tools/convert.pl bin2dec 1011';

理论上它应该从 io 目录移回,然后进入适当的工具目录并调用 convert.pl 脚本,同时将参数传递给它。

所有这一切只是将单引号中的字符串存储到 $myNumber

类似问题的答案不适用于我的 perl 版本。该行

use IPC::System::Simple qw(system capture);

抛出一些错误。但是,仅使用系统即可,如下所示:

my $mynumber = system($^X, "../tools/convert.pl", 'bin2dec', '1011');

我可以在不设置等于某物的情况下使用上面的内容来执行脚本,return 没有值并且只发送参数。

这似乎是完成我需要做的事情的最简单方法,整个程序文件夹可以移动到任何地方,它仍然可以工作,因为没有使用上面程序的父目录。

我喜欢将命令的输出分配给数组,这样我就可以遍历数组以查找错误或其他消息。例如,如果我正在制作一个 zip 文件以通过电子邮件发送给某人,我想在继续制作和发送电子邮件之前检查 zip 程序是否有任何错误。

@msgs = `zip -f myfile.zip *.pl`; # Use backticks

您还可以将输出分配给标量:

$msg = `ls -al *.pl`; # Use backticks

要运行任何系统命令或脚本,您所要做的就是使用“反引号”。通过观察另一个程序员的 perl 代码,我将这些奇怪的引用误读为 'single quotes'。

反引号也很好,因为它们 return 将 STDOUT 中的文本发送到您的 perl 脚本,以便可以将输出分配给变量,如果使用 system("");[= 我发现这是不可能的10=]