perl学习笔记13_引用
内容来源: https://www.runoob.com/perl/perl-database-access.html
1. 说明
Perl引用是一个标量类型可以指向变量, 数组, 哈希表, 甚至子程序,
可以应用在程序的任何地方.
2. 创建引用
my $ref_scalar = \$foo ; # 标量引用
my $ref_array = \@ARGV ; # 列表引用
my $ref_hash = \%ENV ; # 哈希引用
my $ref_code = \&handler ; # 子过程引用
my $ref_glob = \*foo ; # GLOB句柄引用
匿名引用(直接创建对数组或哈希的引用, 不使用变量名):
# 使用方括号创建对数组的匿名引用
# (使用圆括号得到的是数组)
my $ref_a0 = [1, "foo", 2];
my $ref_a1 = [
[1, 2, 3],
[4, 5, 6],
[7, 8, 9],
];
# 使用花括号创建对哈希的匿名引用
# (使用圆括号得到的是hash)
my $ref_h = {a=>4, b=>8};
# 创建对sub的匿名引用
my $ref_code = sub {print "1234"};
3. 解引用(取消引用)
是"创建引用"的逆过程, 即把被引用的内容(标量, 数组, 哈希等)从引用中恢复出来.
需要在引用变量前面加 $, @, %.
#标量解引用
my $var = 10;
my $ref_var = \$var;
print("var = ${$ref_var}\n"); # var=10
#数组解引用
my @a0 = (1, 2, 3);
my $ref_a0 = \@a0;
print("a0=@{$ref_a0}"); # a0=1 2 3
#哈希解引用
my %h0 = (key0=>10, key1=>20, key2=>30);
my $ref_h0 = \%h0;
foreach my $k (keys %{$ref_h0}){
print("$k : ${$ref_h0}{$k}\n");
}
# key2 : 30
# key1 : 20
# key0 : 10
如果不确定引用对应的变量类型, 可以使用ref来判断,
会返回: SCALAR, ARRAY, HASH, CODE, GLOB, REF.
如果不属于这些, 会返回false.
my $ref_a = [1, 2, 3];
printf("ref_a的引用类型为: %s\n", ref($ref_a)); # ARRAY
4. 引用函数
#定义函数
sub print_hash{
my (%hash) = @_;
foreach my $item (%hash){ #这样会把key和value都当做item遍历.
print("item=$item\n");
}
}
#创建对函数的引用
$ref_code = \&print_hash;
#通过引用调用函数
%h = (name=>"Jim", age=>4,);
&{$ref_code}(%h);
# item=name
# item=Jim
# item=age
# item=4