我希望在另一个子内部有一个子
sub a {
sub b {
}
}
我想为sub b
的每次调用创建sub a
的新实例。有没有办法在Perl中执行此操作?
当我运行上面的代码并在sub b
中打印sub a
的地址时,我总是得到sub b
的相同地址
sub a {
print \&b;
sub b{
}
}
This link on Perl Monks说我们可以这样做,但我总是看到sub b
的相同地址。
有没有办法为每次调用sub b
创建sub a
的新实例?
答案 0 :(得分:9)
sub a {
sub b{
}
}
基本上与:
相同sub a {
}
sub b{
}
因为命名子程序存在于符号表中,因此它们是全局的。 你需要返回对子程序的引用。
答案 1 :(得分:7)
命名子程序仅创建一次。您需要返回一个匿名子例程引用,如下所示:
sub a {
my $counter = 1;
return sub {
return $counter++;
}
}
my $c1 = a();
my $c2 = a();
# different references
print "c1 = $c1, c2 = $c2\n";
# each has a different counter
print "c1 ", $c1->(), "\n";
print "c1 ", $c1->(), "\n";
print "c2 ", $c2->(), "\n";
print "c2 ", $c2->(), "\n";
答案 2 :(得分:5)
您可以创建对匿名子的引用:
#!/usr/bin/env perl
use strict;
use warnings;
sub a
{
my($b) = @_;
my $subref = sub { my($a) = @_; print "a = $a; b = $b\n"; return $a + $b; };
&$subref(3);
return $subref;
}
my $sub1 = a(10);
my $a10 = &$sub1(19);
my $sub2 = a(20);
my $a20 = &$sub2(20);
print "a10 = $a10; a20 = $a20; sub1 = $sub1; sub2 = $sub2\n";
示例输出:
a = 3; b = 10
a = 19; b = 10
a = 3; b = 20
a = 20; b = 20
a10 = 29; a20 = 40; sub1 = CODE(0x7ffc3c002eb8); sub2 = CODE(0x7ffc3c032eb8)
答案 3 :(得分:2)
sub a {
my $b = sub {
};
print \&$b;
}
或glob it:
sub a {
local *b = sub {
};
print \&b;
}