让perl脚本使用几个辅助脚本中的一个

让perl脚本使用几个辅助脚本中的一个,perl,include,perl-module,Perl,Include,Perl Module,我有一个从命令行运行的主程序mytool.pl。有几个辅助脚本special1.pl、special2.pl等,每个脚本都包含一对子例程和一个散列,所有脚本的名称都相同。假设这些函数名为MySpecialFunction()、另一个SpecialFunction()和%SpecialData 我希望mytool根据命令行选项包含/使用/导入一个特殊的*.pl文件的内容,仅一个。例如,用户将执行以下操作: bash> perl mytool.pl --specialcase=5 myto

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

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

bash> perl mytool.pl  --specialcase=5
mytools将使用special5.pl中的MySpecialFunction(),并忽略所有其他特殊的*.pl文件

这可能吗?如何做到

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

注意我是一个长期的C程序员,不是perl专家;我可能在问一些显而易见的问题。
这是一个一次性的项目,将在一个月内变成尘埃。在这个简短的项目结束之后,mytool.pl和special?.pl(以及perl本身)都不会引起人们的兴趣。因此,我们不喜欢那些复杂的解决方案,也不需要学习一些深层的魔法。快脏的优先。我猜Perl的模块机制在这方面做得太过火了,但我不知道替代方案是什么。

您可以使用哈希或数组将
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";

当您
使用
模块时,Perl只需
要求
将模块放在
开始
块中(并导入模块导出的项)。由于要更改运行时加载的脚本,请自己调用
require

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

这里有一个关于何时使用
use
vs.
require

将它们合并到一个文件中会对我们产生反作用的问题。“特殊”文件包含许多我们不愿看到的特殊硬连线垃圾。在这种情况下,
在运行时执行相应的文件。文档的链接在我回答的第一段。关键思想是使用“require”关键字。在“use”“require”“do”和“import”(其中三个对我来说是新的)上发现了一个备忘单,回答了我脑海中的几个模糊问题。@DarenW请看一下内置于Perl中的Perl文档。您可以使用
perldoc
程序阅读文档。这也都是免费的。请看教程部分。