perl学习笔记13_引用

发布时间 2023-07-17 14:39:02作者: 编程驴子

内容来源: 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