代码之家  ›  专栏  ›  技术社区  ›  Aakash Goel

我应该在Perl中使用嵌套的子例程吗?

  •  0
  • Aakash Goel  · 技术社区  · 15 年前
    • 我有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
    }
    $
    

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

    3 回复  |  直到 15 年前
        1
  •  6
  •   daxim Fayland Lam    15 年前
    sub one {
        do 'verify1.pl';
    }
    sub two {
        do 'verify2.pl';
    }
    

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

        2
  •  2
  •   Ruel    15 年前

    您可以正常放置子例程。

    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
  •  1
  •   brian d foy    15 年前

    我只需将所有子例程放在一个文件中并重命名任何冲突即可解决此问题。

    不过,听起来您的问题是,您正在为可能遇到的每个验证情况进行硬编码。更好的方法是想出一个可以动态构建验证管道的流程。因为我不知道你需要什么,我不知道 Data::Constraint 或者其他验证模块适合您。要给出任何有用的建议都是极其困难的,因为问题中的信息太少了。