Perl如何获取数组引用的最后一个元素的索引?

35
如果我们有一个数组,那么我们可以执行以下操作:
my @arr = qw(Field3 Field1 Field2 Field5 Field4);
my $last_arr_index=$#arr;

对于数组引用,我们该如何做到这一点?

my $arr_ref = [qw(Field3 Field1 Field2 Field5 Field4)];
my $last_aref_index; # how do we do something similar to $#arr;
4个回答

60
my $arr_ref = [qw(Field3 Field1 Field2 Field5 Field4)];
my ($last_arr_index, $next_arr_index);

如果您需要知道最后一个元素的实际索引,例如您需要循环遍历数组的元素并知道其索引,请使用$# $

$last_arr_index = $#{ $arr_ref };
$last_arr_index = $#$arr_ref; # No need for {} for single identifier
如果你需要知道最后一个元素的索引(例如在没有使用push()方法的情况下填充下一个可用元素),或者你需要知道数组中的元素数量(与上面的数字相同),请使用以下方法:
my $next_arr_index = scalar(@$arr_ref);
$last_arr_index = $next_arr_index - 1; # in case you ALSO need $last_arr_index
# You can also bypass $next_arr_index and use scalar, 
# but that's less efficient than $#$ due to needing to do "-1"
$last_arr_index = @{ $arr_ref } - 1; # or just "@$arr_ref - 1"
   # scalar() is not needed because "-" operator imposes scalar context 
   # but I personally find using "scalar" a bit more readable
   # Like before, {} around expression is not needed for single identifier
如果您实际需要的是访问数组引用中的最后一个元素(例如,您想知道索引的唯一原因是稍后使用该索引访问元素),那么您可以简单地利用“-1”索引指向数组的最后一个元素。感谢Zaid的帖子提供的思路。
$arr_ref->[-1] = 11;
print "Last Value : $arr_ref->[-1] \n";
# BTW, this works for any negative offset, not just "-1". 

谢谢DVK。这正是我在写下我的答案时所想的。 - Zaid

18
my $last_aref_index = $#{ $arr_ref };

9

你需要访问最后一个索引的原因可能是为了获取数组引用中的最后一个值。

如果是这种情况,你可以简单地执行以下操作:

$arr_ref->[-1];
-> 操作符是用来解除引用的。 [-1] 表示数组中的最后一个元素。
如果你需要计算数组中元素的数量,不需要执行 $#{ $arr_ref } + 1。DVK已经展示了一些更好的方法

但是这只给你最后一个元素的值,而不是它的索引。 - friedo
1
是的,但为什么其他人还想要最后一个索引呢?我已经相应地限定了我的回答。 - Zaid
3
我们可能需要它。my $hash_ref = {map { $arr_ref->[$_] => $_ } 0..$#{ $arr_ref }}; - Sachin
你说得对(泛指情况下,他可能只需要访问最后一个元素而不知道最后一个索引),但具体来说,正如Sachin的评论所示,为了循环遍历数组的索引(而不是数组的元素),需要知道索引。感谢你考虑到可能存在的X-Y问题。 - DVK
@Sachin:非常好的观点。我认输了。 - Zaid

0
my $arr_ref = [qw(Field3 Field1 Field2 Field5 Field4)];

my $last_aref_index = $$arr_ref[$#{$arr_ref}];
print "last element is: $last_aref_index\n";

将来,您可能希望使用代码格式(缩进4个空格或在编辑器中单击“代码”按钮)。 - DVK
谢谢。我可能还想仔细阅读问题,因为我的示例返回“Field4”,而不是索引号...jw - jason

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接