2012年11月8日

Perl Reference

取得參照

規則1:若你在變數之前加上「\」,即可取得該變數的參照。
$aref = \@array; # $aref now holds a reference to @array
$href = \%hash;  # $href now holds a reference to %hash
$sref = \$scalar; # $sref now holds a reference to $scalar
規則2:以「[ ITEMS ]」的方式建立新的匿名陣列,並回傳其參照;以「{ ITEMS }」的方式建立新的匿名雜湊,並回傳其參照。
$aref = [ 1, "foo", undef, 13 ]; # $aref now holds a reference to an array
$href = { APR => 4, AUG => 8 };  # $href now holds a reference to a hash
以下兩種做法的結果皆相同:
# This:
 $aref = [ 1, 2, 3 ];

# Does the same as this:
 @array = (1, 2, 3);
 $aref = \@array;
因此若你隨手即以「[]」建立一個新的匿名陣列而不將其存到變數當中,你往後將不知道該如何取得此陣列的內容,雜湊亦如此。

使用參照

規則1:使用捲括號「{}」來使用陣列參照,因此你可以寫成 @{$aref} 來取代 @array。
@a  @{$aref}  #An array
reverse @a reverse @{$aref} #Reverse the array
$a[3]  ${$aref}[3]  #An element of the array
$a[3] = 17; ${$aref}[3] = 17 #Assigning an element
雜湊規則如同陣列
%h   %{$href}  #A hash
keys %h   keys %{$href}  #Get the keys from the hash
$h{'red'}  ${$href}{'red'}  #An element of the hash
$h{'red'} = 17  ${$href}{'red'} = 17 #Assigning an element
規則2:${$aref}[3] 可用 $aref->[3] 來取代; ${$href}{red} 可用 $href->{red}來取代。 若 $aref 存的是某一陣列的參照,則 $aref->[3] 表示為此陣列的第四個元素。千萬不要把 $aref->[3] 與 $aref[3] 這兩者搞混,$aref[3] 當中的 $aref 不過是暫時取代了 @aref 的虛偽表示法;同樣的道理也發生在雜湊當中,不要把$href->{red} 與 $href{red} 給搞混,後者是 %href 的虛偽表示法。

簡單範例

@a = ( [1, 2, 3],
 [4, 5, 6],
 [7, 8, 9]
 );
@a 陣列有三個元素,每個元素皆以參照存放。 $a[1] 即可取得 (4, 5, 6) 這個陣列的參照,因此可進一步使用 $a[1]->[2] 的方式取得該陣列的第三個元素,即可傳回「6」。同理 $a[0]->[1] 會傳回「2」。 這是一個二維陣列的例子,你能以 $a[ROW]->[COLUMN] 的方式取值,卻很麻煩。因此多維陣列可以再將其縮寫為 $a[ROW][COLUMN],將「->」省略。

翻譯自:http://perldoc.perl.org/perlreftut.html

2012年11月1日

Learning Perl 5


l   雜湊(hash),陣列以數字編索引,雜湊以鍵(key)為索引值
l   串列(list);陣列(array);散列(hash)
l   雜湊是一個無序集合,就是一些鍵/值對(key-value pair)的組合,鍵和值都是任意的「純量」,但是「鍵」永遠會被轉換成字串
l   因此數值運算「50/20」的結果為2.5,轉成字串則為「”2.5”」,因此鍵則為2.5
l   雜湊語法:$hash{$key_name} = $value_name;
l   整份雜湊宣告用「%hash_name」,亦可將其指派給陣列,此時為串列語境,順序會被打亂,但值永遠黏在其對應的鍵之後
l   reverse反轉雜湊後,所有鍵值也將被反轉,變成以值找鍵的雜湊
l   雜湊串列當中,可用大箭號「=>」取代逗號「,」,一般將大箭號左邊視為鍵;右邊視為值。但其與逗號並無差異,僅供方便程式員編修
l   大箭號左邊的bareword會自動加上引號「””」,你不加Perl也會自動加上
l   同理,$hash{bareword} 也可行
l   keys函式會傳回雜湊中的所有鍵;values函式則傳回所有值。若無值則傳回空串列,就算正個雜湊順序不定,但值一定會對應到鍵的順序
l   上兩函式若在純量語境下則傳回元素個數
l   exists函式用來判斷鍵是否存在雜湊中,若值為「undef」也表示存在,傳回truedelete函式用來將鍵值從雜湊中移除,因此再用exists函式判斷則為false
l   雙引號內的特殊字符包含「$@\」,因此無法在雙引號內安插雜湊,因為不支援「%
l   %ENV存放系統環境的資訊