3

我有一个要从命令行运行的主程序 mytool.pl。有几个辅助脚本 special1.pl、special2.pl 等,每个都包含几个子例程和一个散列,所有脚本的名称都相同。假设它们被命名为 MySpecialFunction()、AnotherSpecialFunction() 和 %SpecialData。

我希望 mytool 根据命令行选项包含/使用/导入特殊 *.pl 文件之一的内容,只有一个文件。例如,用户将执行以下操作:

bash> perl mytool.pl  --specialcase=5

mytools 将使用 special5.pl 中的 MySpecialFunction(),并忽略所有其他 special*.pl 文件。

这可能吗?怎么做?

重要的是要注意选择使用哪个特殊文件是在运行时进行的,因此在 mytool.pl 顶部添加“使用”可能不是正确的做法。

注意我是一名长期的 C 程序员,而不是 perl 专家。我可能会问一些明显的问题。这是一个一次性的项目,将在一个月内化为乌有。在这个简短的项目结束后,mytool.pl 和 special?.pl(也包括 perl 本身)都不会引起人们的兴趣。因此,我们不关心复杂的解决方案或需要学习一些深层魔法的解决方案。快速和肮脏的首选。我猜 Perl 的模块机制对此有点矫枉过正,但不知道替代方案是什么。

4

2 回答 2

2

您可以使用哈希或数组将值映射specialcase.pl文件并根据需要要求执行它们。

#!/usr/bin/env perl

use strict; use warnings;

my @handlers = qw(one.pl two.pl);

my ($case) = @ARGV;
$case = 0 unless defined $case;

# check that $case is within range

do $handlers[$case];

print special_function(), "\n";
于 2012-04-11T22:34:56.183 回答
1

当你use是一个模块时,Perl 只是require一个块中的BEGIN模块(并导入模块导出项)。由于您想更改在运行时加载的脚本,请致电您require自己。

if ($special_case_1) {
  require 'special1.pl';
  # and go about your business
}

这是关于何时使用vs.的一个很好的参考userequire

于 2012-04-11T23:17:55.873 回答