4

@arr1このコードからの出力としての最後の要素を期待しています:

#!/usr/bin/perl
my @arr1 = qw(son kon bon won kon don pon won pon don won);
my $innr_element = '';
foreach $innr_element ( @arr1 ) {
    ## do something
}
print "--->$innr_element<---\n";

しかし、何も得られません (空白の出力)。$innr_elementブロックスコープの変数 (foreach の内部) として Perl によって内部的に作成されている場合、以下は適切に機能するはずです。

#!/usr/bin/perl
use strict;
my @arr1 = qw(son kon bon won kon don pon won pon don won);
#my $innr_element = '';
foreach $innr_element ( @arr1 ) {
    ##do something
}
print "--->$innr_element<---\n";

しかし、上記のコードは以下のエラーを返します。

Global symbol "$innr_element" requires explicit package name at test.pl line 5.
Global symbol "$innr_element" requires explicit package name at test.pl line 8.
Execution of test.pl aborted due to compilation errors.

したがって、Perl が内部変数を暗黙的に作成していないことは明らかです。

この文書にも同じことが書かれています。If you declare VAR with my, the scope of the variable will extend throughout the foreach statement, but not beyond it.

これは別の perl マジックですか、それとも何か不足していますか?

4

1 に答える 1

10

これについてはドキュメントでは詳しく説明されていませんが、次のように記載されています。

foreach ループは通常のリスト値を繰り返し処理し、変数 VAR をリストの各要素に順番に設定します。変数の前にキーワード my が付いている場合、変数はレキシカル スコープであるため、ループ内でのみ表示されます。それ以外の場合、変数は暗黙的にループに対してローカルであり、ループを終了すると元の値に戻ります。変数が以前に my で宣言されていた場合、グローバル変数の代わりにその変数が使用されますが、ループにローカライズされたままです。この暗黙的なローカライズは、foreach ループでのみ発生します。

したがって、これは魔法ではなく、変数がローカライズされているだけです。例は次のようになります。

my $innr_element='';
foreach local $innr_element ( @arr1 ) {
...
于 2013-09-02T09:10:42.560 に答える