2012-08-08 101 views
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

是的,你想:

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-08 16:43:04

2

是的,这是可以做到:

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

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

当写这样的代码,我的思维过程是:把与@{}语法的数组,然后用$#替换@

0

如果它是

$#array 

用于阵列,这是

$#{ $array_ref } 

用于参考。当然,也可以是返回数组引用任何表情,让你想以下几点:

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

Mini-Tutorial: Dereferencing Syntax