在Perl中调用子例程的非标准方式

时间:2012-05-21 09:34:38

标签: perl subroutine

我正在尝试一种在Perl脚本中调用子例程的不同方法。

我有一组功能如下:

sub Testcase_CheckStatus {
    print "TestCase_CheckStatus called\n";
}

然后我用“CheckStatus”这样的键遍历Perl哈希:

while (my ($k, $v) = each %test_cases) {
    print "TestCase_$k","\n";
    Testcase_$k();
}

基本上,我想在解析hash的键时调用上面的函数Testcase_CheckStatus,但是我收到了这个错误:

  

无法通过包“CheckStatus”找到对象方法“Testcase_”(也许你忘了在./main.pl第17行加载“CheckStatus”?)

我该怎么做才能解决这个问题?有没有其他方法可以做同样的事情?

2 个答案:

答案 0 :(得分:13)

其他方式:

use 5.010;
use warnings;
use strict;


my $testcases = {
    test_case_1 => sub {
        return 1 * shift();
    },
    test_case_2 => sub {
        return 3 * shift();
    },
    test_case_3 => \&SomeSub,
};

for (1 .. 3) {
    say $testcases->{ 'test_case_' . $_ }(7);
}


sub SomeSub {
    return 5 * shift();
}

答案 1 :(得分:6)

以下应该可以让你做你想做的事:

while (my ($k, $v) = each %test_cases) {
    print "TestCase_$k","\n";
    &{"Testcase_$k"}();
}

但是,如果strict正在使用中,则无效。如果您使用strict,则在while循环中需要no strict,例如:

while (my ($k, $v) = each %test_cases) {
    no strict 'refs';

    print "TestCase_$k","\n";
    &{"Testcase_$k"}();
}