Подтвердить что ты не робот

Perl Как получить индекс последнего элемента ссылки на массив?

Если у нас есть массив, мы можем сделать следующее:

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;
4b9b3361

Ответ 1

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

Если вам действительно нужно получить доступ к последнему элементу arrayref (например, причина только), которую вы хотите знать, индекс должен позже использовать этот индекс для доступа элемент), вы можете просто использовать тот факт, что индекс "-1" относится к последнему элементу массива. Опоры для Зайда для идеи.

$arr_ref->[-1] = 11;
print "Last Value : $arr_ref->[-1] \n";
# BTW, this works for any negative offset, not just "-1". 

Ответ 2

my $last_aref_index = $#{ $arr_ref };

Ответ 3

Причина, по которой вам, вероятно, нужно получить доступ к последнему индексу, - это получить последнее значение в ссылке массива.

Если это так, вы можете просто сделать следующее:

$arr_ref->[-1];

Различия оператора ->. [-1] - последний элемент массива.

Если вам нужно подсчитать количество элементов в массиве, не нужно делать $#{ $arr_ref } + 1. DVK показал пару лучших способов, чтобы сделать это.

Ответ 4

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