2010-10-01 58 views
0
  • 我有5个Perl文件,它们是我的环境的5种不同状态的验证脚本。我应该在Perl中使用嵌套子例程吗?

    他们每个人都至少有几个子程序。

  • 到目前为止,州的数量限制为5个,这些工作正常。但是现在,根据当前的设计,我还有20多个环境状态,因此还有20多个Perl脚本。

  • 我想将所有五个脚本移动到只有一个脚本,该脚本将状态作为参数,并具有5​​个不同状态的5个不同子例程。

    这样,当我需要为另一个状态添加验证时,我只需要定义一个新的子例程而不是全新的Perl脚本。

  • 问题是,它将意味着使用嵌套的子例程(它们是known to run into issues),或者展开子例程本身。

例如,

原创剧本

$ cat verify1.pl 
sub a1 { 
    ... 
} 
sub b1 { 
    ... 
} 
a1(); b1(); a1(); 
$ cat verify2.pl 
sub a2 { 
    ... 
} 
sub b2 { 
    ... 
} 
sub c2 { 
    ... 
} 
a2(); b2(); c2(); a2(); 
$ 

综合脚本

$ cat verify.pl 
sub one { 
    ... 
} 
sub two { 
    ... 
} 
my ($arg) = @ARGV; 
if ($arg == 1) { 
    one(); # should do what verify1.pl did 
} 
elsif ($arg == 2) { 
    two(); # should do what verify2.pl did 
} 
$ 

我应该怎么做才能解决这个问题?

+1

不确定,但该链接可能不相关,除非您实际使用mod_perl。只记得打开警告,你应该没事的。 – 2010-10-01 11:45:27

回答

6
sub one { 
    do 'verify1.pl'; 
} 
sub two { 
    do 'verify2.pl'; 
} 

从长远看,但是,它是更好的脚本转换为模块,以便在一个现代和时尚健全管理的复杂性。

+1

+1为使用模块的建议。请参阅http://perldoc.perl.org/perlmod.html#Perl-Modules作为参考(但不作为教程)。 – dolmen 2010-10-01 16:02:33

2

您可以按照它们应该的方式正常放置子例程。

sub a1 { 
    ... 
} 
sub b1 { 
    ... 
} 
sub a2 { 
    ... 
} 
sub b2 { 
    ... 
} 
sub c2 { 
    ... 
} 
sub one { 
    a1(); b1(); a1(); 
} 
sub two { 
    a2(); b2(); c2(); a2(); 
} 
my ($arg) = @ARGV; 
if ($arg == 1) { 
    one(); # should do what verify1.pl did 
} 
elsif ($arg == 2) { 
    two(); # should do what verify2.pl did 
} 
1

我想通过将所有子例程放在一个文件中并重命名任何冲突来解决此问题。

但是,这听起来像是你的问题在于你对可能遇到的每种可能的验证情况都进行了硬编码。更好的方法是创建一个可以动态构建验证管道的过程。由于我不知道你需要什么,我不知道像Data::Constraint或其他验证模块是否适合你。在问题中提供任何有用的建议和极少的信息是非常困难的。

相关问题