2

次のコードがある場合

sub a {
    my $id = shift;
    # does something
    print &a_section($texta);
    print &a_section($textb);
    sub a_section {
        my $text = shift;
        # combines the $id and the $text to create and return some result.
    }
}

a_sectionが によってのみ呼び出されると仮定するとa、メモリ リーク、変数のディペンダビリティ、またはその他の問題が発生しますか?

に渡す必要がないように、代替手段としてこれを検討してい$idますa_section

4

1 に答える 1

9

まず、プライベート サブではありません。外から丸見えです。2、問題が発生します。

$ perl -wE'
   sub outer {
      my ($x) = @_;
      sub inner { say $x; }
      inner();
   }
   outer(123);
   outer(456);
'
Variable "$x" will not stay shared at -e line 4.
123
123     <--- XXX Not 456!!!!

あなたがすることができます:

sub a {
    my $id = shift;

    local *a_section = sub {
        my $text = shift;
        # combines the $id and the $text to create and return some result.
    };

    print a_section($texta);
    print a_section($textb);
}

( を使用して内部サブルーチンを再帰的に呼び出すことができますa_section(...)。)

また:

sub a {
    my $id = shift;

    my $a_section = sub {
        my $text = shift;
        # combines the $id and the $text to create and return some result.
    };

    print $a_section->($texta);
    print $a_section->($textb);
}

( __SUB__->(...)Perl 5.16+ で利用可能なメモリ リークを避けるために内部サブルーチンを再帰的に呼び出したい場合に使用します。)

于 2012-05-16T15:47:37.827 に答える