2

我可以通过动态取名来调用子程序吗?

printf "Enter subroutine name: ";
$var1 = <STDIN>;      # Input is E111;
$var1();

功能E111

sub E111(){
    printf "Hi, this is E111 & Bye \n";
}

有可能这样做吗?

4

2 回答 2

7

您可以在 Perl 中做的事情几乎没有硬性限制,但这是您不想去的地方之一。一种常见的方法是使用调度表

my %call = (
    'name_1' => sub { function body },   # inline, anonymous subroutine
    'name_2' => \&func,                  # or take a reference to a sub
    ...
);

其中sub {}匿名 子 例程, 所以 的 值name_1代码 引用.

然后你用它作为

my $name = <STDIN>;
chomp $name;

$call{$name}->(@arguments);  # runs the code associated with $name

这会在散列中找到键$name并取消引用它的值,coderef;所以它运行该代码。

文档:perlintro 概述perlreftut教程以及perlrefperlsub参考资料。

于 2017-04-04T17:37:43.497 回答
0

一个解法:

print "Enter subroutine name:";

$var1 = <STDIN>;
chomp($var1);

eval "$var1()";

sub E111 {
    print "Hi this is E111 & Bye \n";
}
于 2017-11-08T05:00:18.213 回答