Perl - 第十三章 | Perl 引用(參考)
Perl引用是一種標量資料類型,它保存另一個值的位置,該值可以是標量,數組或哈希。由於其標量性質,因此可以在任何地方使用引用,也可以使用標量。
你可以構造包含對其他列表的引用的列表,這些列表可以包含對哈希的引用,依此類推。這就是在Perl中構建嵌套資料結構的方式。
建立引用
定義變量的時候,在變量名前面加個\,就得到了這個變量的一個引用,比如:
1 2 3 4 5
| $scalarref = \$foo; $arrayref = \@ARGV; $hashref = \%ENV; $coderef = \&handler; $globref = \*foo;
|
在數組中我們可以用匿名數組引用,使用 [] 定義:
1
| $aref= [ 1,"foo",undef,13 ];
|
匿名數組的元素仍然可以是匿名數組,所以我們可以用這種方法構造數組的數組,可以構造任意維度的數組。
1 2 3 4 5
| my $aref = [ [1, 2, 3], [4, 5, 6], [7, 8, 9], ]
|
在哈希中我們可以用匿名哈希引用,使用 {} 定義:
1
| $href= { APR =>4, AUG =>8 };
|
我們也可以建立一個沒有子程序名的匿名子程序引用:
1
| $coderef = sub { print "MoroseDog!\n" };
|
取消引用
取消引用可以根據不同的類型使用 $, @ 或 % 來取消,範例如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
|
$var = 10;
$r = \$var;
print "$var 為 : ", $$r, "\n";
@var = (1, 2, 3);
$r = \@var;
print "@var 為: ", @$r, "\n";
%var = ('key1' => 10, 'key2' => 20);
$r = \%var;
print "%var 為 : ", %$r, "\n";
|
這將產生以下結果:
1 2 3
| 10 為 : 10 1 2 3 為: 123 %var 為 : key110key220
|
如果你不能確定變量類型,你可以使用 ref 來判斷,返回值列表如下,如果沒有以下的值返回 false:
1 2 3 4 5 6
| SCALAR ARRAY HASH CODE GLOB REF
|
範例如下:
1 2 3 4 5 6 7 8 9 10 11 12 13
|
$var = 10; $r = \$var; print "r 的引用類型 : ", ref($r), "\n";
@var = (1, 2, 3); $r = \@var; print "r 的引用類型 : ", ref($r), "\n";
%var = ('key1' => 10, 'key2' => 20); $r = \%var; print "r 的引用類型 : ", ref($r), "\n";
|
這將產生以下結果:
1 2 3
| r 的引用類型 : SCALAR r 的引用類型 : ARRAY r 的引用類型 : HASH
|
循環引用
循環引用在兩個引用相互包含是出現。你需要小心使用,不然會導致內存洩露,如下範例:
1 2 3 4 5 6
|
my $foo = 100; $foo = \$foo;
print "Value of foo is : ", $$foo, "\n";
|
這將產生以下結果:
1
| Value of foo is : REF(0x7f8211810b50)
|
引用函數
函數引用格式: &
調用引用函數格式: & + 建立的引用名。
範例如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
|
sub PrintHash{ my (%hash) = @_; foreach $item (%hash){ print "元素 : $item\n"; } } %hash = ('name' => 'morose', 'age' => 30);
$cref = \&PrintHash;
&$cref(%hash);
|
這將產生以下結果:
1 2 3 4
| 元素 : age 元素 : 30 元素 : name 元素 : morose
|
註:以上參考了
Tutorialspoint, Perl - References