Как работает массив $ # в Perl? - PullRequest
       19

Как работает массив $ # в Perl?

1 голос
/ 17 декабря 2009

В следующем примере:

my $info = 'NARIKANRU';
my @first_one = split /,/, $info;
print "$first_one[$#first_one]$first_one[$#first_one-1]\n";

Вывод:

NARIKANRUNARIKANRU

Я не уверен, что это правильно, потому что в @first_one есть только один элемент, а $#first_one - индекс этого элемента.

Учитывая, что $#first_one не равен $#first_one - 1, почему один элемент в @first_one печатается дважды?

Ответы [ 3 ]

13 голосов
/ 17 декабря 2009

Вывод правильный. В $info нет запятых, поэтому split возвращает список, состоящий из одного элемента.

$#first_one - это индекс последнего (и в данном случае также первого и единственного) элемента @first_one. Для одного элемента $#first_one равно 0. Следовательно, $first_one[$#first_one] равно $first_one[0].

Кроме того, $first_one[$#first_one-1] - это $first_one[-1], то есть краткий способ ссылки на последний элемент массива.

Конечно, все бы не сработало, если бы для $ [ было установлено другое значение, отличное от значения по умолчанию. Очевидно, что все работает, если $[ отрицательно.

См. Также perldoc perldata .

Наконец, вы спрашиваете, есть ли что-то не так в вашем коде. Из того, что я вижу, вы не используете строгие и предупреждения . Вы должны.

3 голосов
/ 17 декабря 2009

$#array просто дает вам последний индекс в массиве, который содержит значение, где @array возвращает вам размер массива при использовании в скалярном контексте, который вернул бы вас на 1 больше, чем это.

Например:

#!/usr/bin/perl

@array = ();
push(@array,10);
push(@array,11);

print $#array, "\n";         # Prints 1
print scalar(@array), "\n";  # Prints 2
print $array[$#array], "\n"; # Prints 11 (i.e. the last element)

Заявив, что вы разделены, создается список только из одного элемента. Таким образом, $#array предоставит вам 0. Доступ к массиву с индексом -1 также даст вам последний элемент в вашем массиве, поскольку у вас только один элемент в вашем массиве, выражение $#info - 1 равно -1 (т.е. последний элемент в вашем массиве)

Если бы в вашем массиве было 2 элемента, скажите: собака, кошка. Тогда $#array даст кошку, в то время как $#array - 1 даст собаку, потому что вы не будете производить -1 со своим выражением $#info - 1.

1 голос
/ 17 декабря 2009

Возможно, вы хотели написать:

@first_one = split('', $info);

чтобы получить список символов?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...