perl - 如何在循环中调用动态子程序

标签 perl

任何人都可以帮助找到在循环中调用子例程的简单方法吗? 现在,我手动调用它们如下。我如何以编程方式执行此操作?

&case1Validate($fTxt);
&case2Validate($fTxt);
&case3Validate($fTxt);
&case4Validate($fTxt);
&case5Validate($fTxt);
&case6Validate($fTxt);
&case7Validate($fTxt);
&case8Validate($fTxt);
&case9Validate($fTxt);
&case10Validate($fTxt);

最佳答案

strict 'refs' 提示间接引用(“使用变量作为变量名”)是有原因的。有几个原因,事实上,其中大部分与间接引用有关,会降低您调试和维护代码的能力。

更好的方法是创建一个代码引用数组并对其进行迭代,依次调用每个代码引用:

#!/usr/bin/env perl    

use strict;
use warnings;
use 5.010;

sub case1Validate { return 'Case 1: ' . $_[0] }
sub case2Validate { return 'Case 2: ' . $_[0] }
sub case3Validate { return 'Case 3: ' . $_[0] }

my @validators = (\&case1Validate, \&case2Validate, \&case3Validate);

for my $sub (@validators) {
  say $sub->('foo');
}

另一种技术在您可能不想每次都以相同顺序调用每个子程序的情况下非常有用,它是使用哈希作为调度表:

#!/usr/bin/env perl    

use strict;
use warnings;
use 5.010;

sub case1Validate { return 'Case 1: ' . $_[0] }
sub case2Validate { return 'Case 2: ' . $_[0] }

my %validators = (
  case1 => \&case1Validate, 
  case2 => \&case2Validate, 
  # If the sub is small and you're not using it separately, you can even define
  # it in-line!
  case5 => sub { return 'Case 5: ' . $_[0] }
);

for my $i (1 .. 5) {
  # Because of "exists", will only attempt to print for cases 1, 2, and 5,
  # since cases 3 and 4 don't exist
  say $validators{"case$i"}->('foo') if exists $validators{"case$i"};
}

关于perl - 如何在循环中调用动态子程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42969932/

相关文章:

perl - 如何将证书安装到 Perl 证书库? 401未经授权

perl - Perl 中相当于 Java 的 Double.doubleToLongBits() 的是什么?

perl - 我应该在 Perl 中逐行读取文件时主动释放内存吗?

perl - WWW::Mechanize SSL 证书未验证(加密警报 21 - 解密失败)

perl - Perl 中的覆盖函数示例

perl - 如何使用Perl输入密码,并用'*'替换字符?

regex - 在正则表达式中使用替换比后续替换更快吗?

perl - 如何清理编辑器等环境变量?

perl - 你如何取消引用返回值?

multithreading - Perl - 多线程/ fork /同步问题 :