6

別のサブ内にサブを配置したいのですが、

sub a {
    sub b {
    }
}

sub bへの呼び出しごとにの新しいインスタンスを作成したいと考えていますsub a。Perlでこれを行う方法はありますか?

上記のコードを実行してのアドレスを出力sub bすると、sub a常に同じアドレスが得られsub bます

sub a {
    print \&b;
    sub b{
    }
}

Perl Monks のこのリンクでは、これを行うことができると書かれていますが、常に同じアドレスが表示されsub bます。

sub bへの呼び出しごとに新しいインスタンスを作成する方法はありますsub aか?

4

4 に答える 4

12
sub a {
    sub b{
    }
}

基本的には次と同じです:

sub a {

}
sub b{
}

名前付きサブルーチンはシンボル テーブルに存在するため、それらはグローバルです。サブルーチンへの参照を返す必要があります。

于 2012-10-13T14:46:58.720 に答える
8

名前付きサブルーチンは一度だけ作成されます。次のような匿名サブルーチン参照を返す必要があります。

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";
于 2012-10-13T14:36:29.193 に答える
7

匿名サブへの参照を作成できます。

#!/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)
于 2012-10-13T15:15:29.390 に答える
3
sub a {
    my $b = sub {
    };
    print \&$b;
}

またはそれをグロブします:

sub a {
    local *b = sub {
    };
    print \&b;
}
于 2012-10-13T17:02:31.460 に答える