我有一段时间有这个问题。
假设我有一个简单的数组,
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));
但这只会使代码变得更加复杂。
所以我的问题是,$#是否可用于除简单数组之外的任何其他内容(引用,函数调用返回的列表等等),如果是,如何?
由于
答案 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} }