2013-04-19 2 views
0

Почему третья печать не удалась?Синтаксис привязки массива Perl

my @a = (0,1,2,3); 
print @a[[email protected]]; # works 
print @a[0..2];  # works 
print @a[0..-2]; # prints nothing 

Это не для меня ясно, смысл [email protected] используется в этом @a[[email protected]] заявлении. Это специальный синтаксис? Что делает этот специальный синтаксис (если вообще) в дополнение к $#a? Это какой-то сахар (что любопытно, поскольку оно короче только одним символом), где символ для массива, используемого в субиндексе, означает «длина этого массива»?

+1

- @ a = -4, то есть отрицательный размер массива @a. – imran

ответ

5

3-print печатает ничего, потому что, согласно perldoc perlop:

Если левое значение больше правого значения, то он возвращает пустой список.

perldoc B::Deparse Смотрите также:

$ perl -MO=Deparse code.pl 
my(@a) = (0, 1, 2, 3); 
print @a[[email protected] .. -2]; 
print @a[0..2]; 
print @a[()]; 

Я считаю, print @a[[email protected]]; "работает", потому что это на самом деле, как @a[-4 .. -2]. Согласно perldoc perldata:

Отрицательный индекс извлекает свое значение с конца.

Итак, 3 имеет индекс -1, 2 находится в индексе -2, 1 находится в индексе -3, а 0 - в индексе -4.

4

Нет ничего особенного в области [email protected]. В скалярном контексте @a возвращает количество элементов в массиве, поэтому [email protected] возвращает отрицательное значение этого числа. например Если для элементов находится @a, @a - 4 и [email protected] - -4.

Так, массив с четырьмя элементами,
@a[[email protected]] означает @a[-4..-2],
, что означает @a[-4,-3,-2],
, что означает «4-й элемент с конца, 3-й элемент с конца, и 2-й элемент из end ",
, что означает" элементы 0, 1 и 2 ".

+0

О, ладно. Концепция «скалярного контекста» по-прежнему нова для меня –

+0

Каждый оператор, который может вернуть что-то, отличное от одного скаляра, обязательно должен возвращать что-то другое в скалярном контексте, чем в контексте списка. Каждый отдельный оператор должен вернуть. – ikegami

+1

@ikegami нам нужно иметь вечеринку, когда вы получаете 80 тысяч очков. – cooldood3490

Смежные вопросы