2013-08-20 92 views
0

我發現,這是你如何使用範圍與數組引用:

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

所以,情況是我沒有訪問所有這些不同的Perl環境(測試),但如果代碼,這將最終得到編譯,未能編譯,我惹上麻煩。

的Perl版本:5.16.25.10.1,並5.8.8

有人知道嗎?

谷歌的Perl語法錯綜複雜而沒有變得聰明,實際上是不可能的。我不夠聰明爲此做。

P.S.你知道嗎? @$arr_ref[-3..$#$arr_ref]爲您提供了最後三個元素,然後將整個數組添加到它。這顯然是[-3..5]意味着:給元素-3(= 3)至5,然後附加05

這是因爲perl沒有以合理的方式處理它,除非兩個範圍索引都是相同的符號:要得到一個包含從上到下的第5個分片,您只需使用@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

$#語法(用來獲取的最後一個元素的索引中的陣列),因爲5.x的線的曙光已經Perl的語法的一部分。實際上,$#array的語法已經存在,因爲至少Perl 4,但引用(因此$#$aref語法)在Perl 5之前不存在。

雖然它不是一般的可搜索的,但如果您想知道何時發生更改出現在Perl中,您需要查看每個版本的perldelta文檔。