【问题标题】:Should I use nested subroutines in Perl?我应该在 Perl 中使用嵌套子例程吗?
【发布时间】:2010-10-01 09:47:27
【问题描述】:
  • 我有 5 个 Perl 文件,它们是我环境中 5 种不同状态的验证脚本。

    它们中的每一个都至少有几个子例程。

  • 到目前为止,状态数被限制为 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
}
$

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

【问题讨论】:

  • 不确定,但除非您实际使用 mod_perl,否则该链接可能不相关。只要记住打开警告,你应该没事..

标签: perl nested subroutine


【解决方案1】:
sub one {
    do 'verify1.pl';
}
sub two {
    do 'verify2.pl';
}

然而,从长远来看,最好将脚本转换为模块,以便以现代和理智的方式管理复杂性。

【讨论】:

【解决方案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
}

【讨论】:

    【解决方案3】:

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

    但是,听起来您的问题是您正在为可能遇到的每种可能的验证情况进行硬编码。更好的方法是提出一个可以动态构建验证管道的流程。由于我不知道您需要什么,我不知道 Data::Constraint 或其他验证模块是否适合您。问题中的信息如此之少,很难给出任何有用的建议。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-04-20
      • 2022-01-17
      • 2013-08-11
      • 1970-01-01
      • 2010-09-05
      相关资源
      最近更新 更多