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 的一行中做一些事情并不一定意味着你应该这样做。

于 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 回答