Perl Как получить индекс последнего элемента ссылки на массив? - PullRequest
32 голосов
/ 04 июня 2010

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

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 ]

53 голосов
/ 04 июня 2010
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

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

$arr_ref->[-1] = 11;
print "Last Value : $arr_ref->[-1] \n";
# BTW, this works for any negative offset, not just "-1". 
16 голосов
/ 04 июня 2010
my $last_aref_index = $#{ $arr_ref };
7 голосов
/ 04 июня 2010

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

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

$arr_ref->[-1];

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

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

0 голосов
/ 04 июня 2010
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";
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...