【问题标题】:Having a perl script make use of one among several secondary scripts让 perl 脚本使用几个辅助脚本中的一个
【发布时间】:2012-04-11 22:17:42
【问题描述】:

我有一个要从命令行运行的主程序 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 顶部添加“use”可能不是正确的做法。

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

【问题讨论】:

    标签: perl include perl-module


    【解决方案1】:

    您可以根据需要使用散列或数组将specialcase 的值映射到.pl 文件和requiredo

    #!/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";
    

    【讨论】:

    • 将它们合并到一个文件中对我们来说会适得其反。 “特殊”文件包含许多我们不愿看到的特殊硬连线垃圾。
    • 在这种情况下,do 运行时的相应文件。文档的链接在我的回答的第一段中。
    【解决方案2】:

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

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

    这里有一个good reference,说明何时使用userequire

    【讨论】:

    • 关键思想是使用'require'关键字。在snowfrog.net/2009/05/09/perl-use-require-import-and-do 找到了关于“使用”、“要求”、“执行”和“导入”(其中三个对我来说是新的)的备忘单,它回答了我脑海中的几个模糊问题。
    • @DarenW 查看 Perl 内置的 Perl 文档。您使用perldoc 程序来阅读文档。这一切都在web 上。看看教程部分。
    猜你喜欢
    • 2016-05-05
    • 1970-01-01
    • 2018-01-06
    • 2013-07-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-07
    相关资源
    最近更新 更多