3

私はしばらくの間、この質問をしてきました。

単純な配列があると仮定すると、

    my @arr;
    foreach my $i (0..$#arr){
        print "\$arr[$i] = '$arr[$i]'\n";
    }

$#arr は単に配列の最後のインデックスを返します

ただし、次のようなより複雑なものに使用したい場合はどうなりますか?:

   foreach my $i (0..$#@{$someHash{$}[$b]{$c}});

確かに、私はそれを次のように書くことができます

   foreach my $i (0..(scalar(@{$someHash{$}[$b]{$c}})-1));

しかし、それはコードをさらに複雑にするだけです。

だから私の質問は、 $# を単純な配列(参照、関数呼び出しから返されるリストなど)以外に使用できるかということです。

ありがとう

4

3 に答える 3

4

はい、あなたはしたいです:

for my $i (0..$#{$some_hash{$a}[$b]{$c}}) { ... }

可能であれば、しかし、私は一般的に好む

for my $value (@{ $some_hash{$a}[$b]{$c} }) { ... }

インデックス値は、配列に格納された値ほど役立つことはめったにありません。通常、両方が必要な場合は、代わりにカウンターを追加します。

my $i = 0;
for my $value (@{ $some_hash{$a}[$b]{$c} }) { ... } continue { $i++ }

わかりやすくするために、ループ内で複雑な変数も事前に割り当てます。

my $i = 0;
my $widget_list = $some_hash{$a}[$b]{$c};
for my $value (@{ $widget_list }) { ... } continue { $i++ }

Perl では 1 行でいくつかのことを実行できるからといって、必ずしも実行すべきであるとは限りません。

于 2012-08-08T16:26:10.290 に答える
2

はい、できます:

sub foo {
    return { 'bar' => { 'array' => [ 'qux', [qw/ has three elements /] ] } };
}

print $#{ foo->{'bar'}->{'array'}->[1] };    # 2

そのようなコードを書くとき、私の思考プロセスは次のとおりです。@{}構文を使用して配列に到達し、次に。に置き換え@ます$#

于 2012-08-08T16:30:14.060 に答える
0

もし

$#array

配列の場合、それは

$#{ $array_ref }

参考までに。もちろん、配列参照を返す任意の式を使用できるため、次のようにする必要があります。

$#{ $someHash{$}[$b]{$c} }

ミニチュートリアル: 逆参照構文を参照してください。

于 2012-08-08T18:54:20.407 に答える