$#接受perl中的输入是什么?

时间:2012-08-08 16:23:00

标签: perl

我有一段时间有这个问题。

假设我有一个简单的数组,

    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));

但这只会使代码变得更加复杂。

所以我的问题是,$#是否可用于除简单数组之外的任何其他内容(引用,函数调用返回的列表等等),如果是,如何?

由于

3 个答案:

答案 0 :(得分: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 :(得分:2)

是的,可以做到:

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

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

编写此类代码时,我的思维过程是:使用@{}语法访问数组,然后将@替换为$#

答案 2 :(得分:0)

如果是

$#array

对于数组,它是

$#{ $array_ref }

供参考。当然,它可以是任何返回数组引用的表达式,因此您需要以下内容:

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

请参阅Mini-Tutorial: Dereferencing Syntax