(本文参考博客)
1. Perl 引用
定义变量的时候,在变量名前面加个\,就得到了这个变量的一个引用。
Perl 引用是一个标量类型可以指向变量、数组、哈希表(也叫关联数组)甚至子程序,可以应用在程序的任何地方。
#标量引用
my$scalar=42;
my$sref=\$scalar ;
# 数组引用
my@array= (1,2,3) ;
my$aref=\@array ;
#哈希引用
my%hash= ("name"=>"foo","age"=>42,"gender"=>"male") ;
my$href=\%hash ;
#子程序引用
sub handler {return 1}
$coderef = \&handler;
#句柄引用
$globref = \*STDOUT;
1.1 匿名数组
定义一个普通数组:
my @a = (1,2,3);
定义一个匿名数组引用:匿名数组引用-用 [ ] 定义
my $a = [1,2,3];
定义一个以匿名数组引用为元素的数组(实际是二维数组):匿名数组的元素仍然可以是匿名数组,所以我们可以用这种方法构造数组的数组,可以构造任意维度的数组。
@a = (
[1, 2, 3],
[4, 5, 6],
[7, 8, 9]
)
#其中:$a[1][2]表示第二行第三列元素6.
#也可以写成$a[1]->[2],不过很少有人这么写。还可以写成${$a[1]}[2],几乎没人这么写!
1.2 匿名哈希
匿名哈希引用:用 { } 定义
2. 取消引用
取消引用可以根据不同的类型使用 $, @ 或 % 来取消。
#!/usr/bin/perl
$var = 10;
# $r 引用 $var 标量
$r = \$var;
# 输出本地存储的 $r 的变量值
print "$var 为 : ", $$r, "\n";
@var = (1, 2, 3);
# $r 引用 @var 数组
$r = \@var;
# 输出本地存储的 $r 的变量值
print "@var 为: ", @$r, "\n";
%var = ('key1' => 10, 'key2' => 20);
# $r 引用 %var 数组
$r = \%var;
# 输出本地存储的 $r 的变量值
print "\%var 为 : ", %$r, "\n";
执行以上实例执行结果为:
10 为 : 10
1 2 3 为: 123
\%var 为 : key110key220
2.1 解引用
2.1.1 数组解引用
@a @{$aref} #数组
reverse@a reverse @{$aref}
$a[3] ${$aref}[3]
$a[3] =17; ${$aref}[3] =17
2.1.2 哈希解引用
%h %{$href} #哈希
keys%h keys%{$href}
$h{'red'} ${$href}{'red'}
$h{'red'} =17 ${$href}{'red'} =17
注意:当{}内部是$var的形式时,{}是可以省略的,也就是说@{$aref}等价于@$aref,不过初学最好养成使用{}的习惯。
2.1.3 使用箭头解引用
前两种方法比较繁琐,这种很简洁,就是使用箭头符号 ->。
$aref->[] #数组解引用
$href->{} #哈希解引用
$href->() #子过程解引用
$aref->[0] =3 ;
$href->{name} ="autumn" ;
$sref=2 ;
3. 引用函数
函数引用格式: \&
调用引用函数格式: & + 创建的引用名。
#!/usr/bin/perl
# 函数定义
sub PrintHash{
my (%hash) = @_;
foreach $item (%hash){
print "元素 : $item\n";
}
}
%hash = ('name' => 'runoob', 'age' => 3);
# 创建函数的引用
$cref = \&PrintHash;
# 使用引用调用函数
&$cref(%hash);
执行以上实例执行结果为:
元素 : age
元素 : 3
元素 : name
元素 : runoob