- Perl 基础
- Perl - 首页
- Perl - 简介
- Perl - 环境
- Perl - 语法概述
- Perl - 数据类型
- Perl - 变量
- Perl - 标量
- Perl - 数组
- Perl - 哈希表
- Perl - IF...ELSE
- Perl - 循环
- Perl - 运算符
- Perl - 日期和时间
- Perl - 子程序
- Perl - 引用
- Perl - 格式
- Perl - 文件 I/O
- Perl - 目录
- Perl - 错误处理
- Perl - 特殊变量
- Perl - 编码规范
- Perl - 正则表达式
- Perl - 发送邮件
- Perl 高级
- Perl - 套接字编程
- Perl - 面向对象
- Perl - 数据库访问
- Perl - CGI 编程
- Perl - 包和模块
- Perl - 进程管理
- Perl - 嵌入式文档
- Perl - 函数引用
- Perl 资源
- Perl - 问答
- Perl - 快速指南
- Perl - 资源
- Perl - 讨论
Perl - 引用
Perl 引用是一种标量数据类型,它保存另一个值的地址,该值可以是标量、数组或哈希表。由于其标量特性,引用可以在任何可以使用标量的地方使用。
您可以构造包含对其他列表的引用的列表,这些列表可以包含对哈希表的引用,依此类推。这就是 Perl 中嵌套数据结构的构建方式。
创建引用
为任何变量、子程序或值创建引用很容易,只需在其前面加上反斜杠即可,如下所示:
$scalarref = \$foo; $arrayref = \@ARGV; $hashref = \%ENV; $coderef = \&handler; $globref = \*foo;
您不能使用反斜杠运算符创建 I/O 句柄(文件句柄或目录句柄)的引用,但可以使用方括号创建对匿名数组的引用,如下所示:
$arrayref = [1, 2, ['a', 'b', 'c']];
类似地,您可以使用花括号创建对匿名哈希表的引用,如下所示:
$hashref = {
'Adam' => 'Eve',
'Clyde' => 'Bonnie',
};
可以使用不带子程序名的 `sub` 创建对匿名子程序的引用,如下所示:
$coderef = sub { print "Boink!\n" };
解引用
解引用从引用指向的位置返回该值。要解引用,只需根据引用指向标量、数组或哈希表,在引用变量前面使用 $、@ 或 % 即可。以下示例解释了该概念:
#!/usr/bin/perl
$var = 10;
# Now $r has reference to $var scalar.
$r = \$var;
# Print value available at the location stored in $r.
print "Value of $var is : ", $$r, "\n";
@var = (1, 2, 3);
# Now $r has reference to @var array.
$r = \@var;
# Print values available at the location stored in $r.
print "Value of @var is : ", @$r, "\n";
%var = ('key1' => 10, 'key2' => 20);
# Now $r has reference to %var hash.
$r = \%var;
# Print values available at the location stored in $r.
print "Value of %var is : ", %$r, "\n";
执行上述程序后,会产生以下结果:
Value of 10 is : 10 Value of 1 2 3 is : 123 Value of %var is : key220key110
如果您不确定变量类型,则可以使用 **ref** 很容易地知道其类型,如果其参数是引用,则返回以下字符串之一。否则,返回 false:
SCALAR ARRAY HASH CODE GLOB REF
让我们尝试以下示例:
#!/usr/bin/perl
$var = 10;
$r = \$var;
print "Reference type in r : ", ref($r), "\n";
@var = (1, 2, 3);
$r = \@var;
print "Reference type in r : ", ref($r), "\n";
%var = ('key1' => 10, 'key2' => 20);
$r = \%var;
print "Reference type in r : ", ref($r), "\n";
执行上述程序后,会产生以下结果:
Reference type in r : SCALAR Reference type in r : ARRAY Reference type in r : HASH
循环引用
当两个引用相互包含对方的引用时,就会发生循环引用。创建引用时必须小心,否则循环引用可能导致内存泄漏。以下是一个示例:
#!/usr/bin/perl my $foo = 100; $foo = \$foo; print "Value of foo is : ", $$foo, "\n";
执行上述程序后,会产生以下结果:
Value of foo is : REF(0x9aae38)
对函数的引用
如果您需要创建信号处理程序,则可能会发生这种情况,您可以通过在函数名前面加上 `\&` 来生成对函数的引用,并且要解引用该引用,您只需使用 `&` 前缀引用变量即可。以下是一个示例:
#!/usr/bin/perl
# Function definition
sub PrintHash {
my (%hash) = @_;
foreach $item (%hash) {
print "Item : $item\n";
}
}
%hash = ('name' => 'Tom', 'age' => 19);
# Create a reference to above function.
$cref = \&PrintHash;
# Function call using reference.
&$cref(%hash);
执行上述程序后,会产生以下结果:
Item : name Item : Tom Item : age Item : 19
广告