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