2013-08-20 5 views
0

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

@$aref[2..$#$aref] 

Таким образом, ситуация такова, что у меня нет доступа ко всем этим различным средам Perl (для тестирования), но если код , , который в итоге будет скомпилирован на всех из них, не скомпилируется, у меня проблемы.

Perl версии: 5.16.2, 5.10.1 и 5.8.8

Кто-нибудь знает?

Это нелогично для Google для интерпретаций синтаксиса perl без умения. Я недостаточно умен, чтобы сделать это для этого.

P.S. Вы знали? @$arr_ref[-3..$#$arr_ref] дает вам три последних элемента, затем к нему добавляется весь массив. По-видимому, это означает, что [-3..5] означает: дать элементы -3 (= 3) до 5, затем добавить 0 через 5.

Это потому, что perl не имеет дело с этим разумным образом, если оба индекса диапазона не имеют одинакового знака: чтобы получить кусочек, содержащий пятый от последнего до конца, вы просто используете @arr[-5..-1].

+6

Это разумно - '-3 .. 5' - это серия -3, -2, -1, 0, 1, ... 5, и вы запрашиваете кусочек этих индексов. ** У вас есть массив из шести элементов **, поэтому элемент с индексом -3 также должен быть таким же, как и в индексе 3. – pilcrow

+0

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

ответ

6

Эти обозначения на самом деле не являются особыми; это то, как работают массивы slice, arrayref, .. и $#, и вы все вместе ставите их вместе. Но чтобы ответить на ваш вопрос, да, он работает в Perl 5.8.8:

$ perl -v | grep . | head -1 
This is perl, v5.8.8 built for Linux-2.6c2.5-x86_64-64int 

$ perl -e '$aref = [1 .. 5]; print "<$_>\n" foreach @$aref[2..$#$aref]' 
<3> 
<4> 
<5> 

(и даже в гораздо более ранних версиях).

4

$#array возвращает последний указатель массива @array. Аналогично, $#{ $aref } возвращает последний индекс массива, на который ссылается $aref. Это можно сократить до $#$aref.

$x .. $y является оператором диапазона. Он возвращает цифры от $x до $y включительно. (Он также работает для некоторых строк.) Например, -3 .. 5 означает -3, -2, -1, 0, 1, 2, 3, 4, 5.

@array[...] - это срез массива. Он возвращает элементы массива @array, указанные в выражении индекса. Аналогично, @{ $aref }[...] возвращает элементы массива, на которые ссылается $aref. Это можно сократить до @$aref[...].

Все эти функции предшествуют 5.8.8. Они даже предшествуют 5.6.0.

$ perl -v | grep 'This is' 
This is perl, v5.8.8 built for i386-linux-thread-multi 

$ perl -le'@array = qw(a b c d e); print @array[2..$#array]' 
cde 

$ perl -le'$aref = [qw(a b c d e)]; print @{ $aref }[2..$#{ $aref }]' 
cde 

$ perl -le'$aref = [qw(a b c d e)]; print @$aref[2..$#$aref]' 
cde 

Обратите внимание, что более мощная нарезка выражение в настоящее время обсуждается разработчики Perl.

Прямо сейчас нет простого способа сделать следующее без использования этого временного массива.

sub f { ... } 
my @a = f(); 
my @b = @a[2..$#a]; 
+0

Мне нравится, как это делает Python. Поверните '..' на 90 градусов. –

3

$# синтаксис (используется для получения индекса последнего элемента массива) является частью синтаксиса Perl, так как на заре 5.x линии. На самом деле синтаксис $#array существует, по крайней мере, с Perl 4, но ссылки (и, следовательно, синтаксис $#$aref) не существовали до Perl 5.

Хотя это не является тривиально доступным для поиска, если вы хотите знать, когда изменение появился в Perl, вам нужно посмотреть документацию perldelta для каждой версии.

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