2

Perlのサブルーチン内でグローバル変数を宣言して、その変数をフックされたvoid関数で使用できるかどうか疑問に思いましたが、サブルーチンで宣言することにより、グローバルの悪影響を制限しました。

したがって、サブルーチンはXML::Parser、次のような方法で、一連の要素のIDを収集するために使用します。

sub getRecipeIDs {
    my $recipe = shift;
    my @elements = ();

    my $parser = new XML::Parser(Style => 'Tree',
        Handlers => {
            Start => sub {
                my ($expat, $element, %attrs) = @_;
                if ($element eq 'recipe') {
                    push @elements, $attrs{id};
                }
        }});

    $parser->parse($recipe);

    return @elements;
}

スクリプトでも使用strictしています。

したがって、匿名サブルーチンに対して@elementsローカルであるが表示されるように宣言したいと思います。getRecipeIDs

お時間をいただきありがとうございます。どんな助けでも大歓迎です。

4

3 に答える 3

6

例を書いた方法ですでに機能しているはずです。""で行っているmy $func = sub { ... }のは、囲んでいるスコープの変数(この場合は)にアクセスできるクロージャを作成することです@elements

于 2012-08-27T12:56:40.843 に答える
4

コードはそのままで正常に動作するはずです

匿名サブルーチンの深さにもかかわらず、そのスコープには字句配列が含まれており、@elements自由にアクセスできます

さらに、サブルーチンは配列への参照としてカウントされるため、呼び出しの最後にスコープから外れたときにガベージコレクションされることはありません。getRecipeIDs

于 2012-08-27T13:01:10.337 に答える
3

my結構です。字句変数は、匿名サブルーチンなどのネストされたスコープに表示されます。

したがって、コードはそのまま機能するはずです。

于 2012-08-27T12:56:02.173 に答える