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

沒有留言:

張貼留言