0

これが配列参照で範囲を使用する方法であることを発見しました:

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

したがって、これらすべての異なる perl 環境に (テストするために) アクセスすることはできませんが、最終的にすべての環境でコンパイルされるコードがコンパイルに失敗すると、問題が発生します。

Perl バージョン: 5.16.25.10.1、および5.8.8

誰か知ってる?

巧妙にならなければ、perl 構文の複雑さをグーグルで検索することは物理的に不可能です。私はこれを行うほど賢くありません。

PS ご存知でしたか?@$arr_ref[-3..$#$arr_ref]最後の 3 つの要素を取得すると、配列全体が追加されます。明らかにそれが[-3..5]意味することです: 要素-3(= 3) をに与えてから、を通して5追加します。05

これは、両方の範囲インデックスが同じ符号でない限り、perl が適切な方法でそれを処理しないためです: 最後から最後までの 5 番目を含むスライスを取得するには、単に を使用します@arr[-5..-1]

4

3 に答える 3

6

この表記法は実際には特別なものではありません。これは、配列のスライス、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>

(そしてずっと前のバージョンでさえ)。

于 2013-08-20T18:34:57.453 に答える
4

$#arrayarray の最後のインデックスを返します@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];
于 2013-08-20T18:47:46.820 に答える
3

構文 (配列内の$#最後の要素のインデックスを取得するために使用される) は、5.x ラインの黎明期から Perl の構文の一部となっています。実際、$#array構文は少なくとも Perl 4 から存在していましたが、参照 (したがって$#$aref構文) は Perl 5 まで存在しませんでした。

簡単に検索できるわけではありませんが、Perl にいつ変更が加えられたか知りたい場合は、各バージョンのperldeltaドキュメントを参照する必要があります。

于 2013-08-20T19:15:42.537 に答える