当前位置: 首页 > 文档资料 > Perl 入门教程 >

参考文献(References)

优质
小牛编辑
126浏览
2023-12-01

Perl引用是一种标量数据类型,它保存另一个值的位置,该值可以是标量,数组或散列。 由于它的标量性质,可以在任何地方使用引用,可以使用标量。

您可以构造包含对其他列表的引用的列表,其中可以包含对哈希的引用,依此类推。 这就是嵌套数据结构在Perl中的构建方式。

创建参考

通过在前面加上反斜杠,可以很容易地为任何变量,子例程或值创建引用,如下所示 -

$scalarref = \$foo;
$arrayref  = \@ARGV;
$hashref   = \%ENV;
$coderef   = \&handler;
$globref   = \*foo;

您不能使用反斜杠运算符在I/O句柄(文件句柄或dirhandle)上创建引用,但可以使用方括号创建对匿名数组的引用,如下所示 -

 $arrayref = [1, 2, ['a', 'b', 'c']];

类似地,您可以使用大括号创建对匿名哈希的引用,如下所示 -

$hashref = {
   'Adam'  => 'Eve',
   'Clyde' => 'Bonnie',
};

可以使用不带子名称的sub创建对匿名子例程的引用,如下所示 -

$coderef = sub { print "Boink!\n" };

Dereferencing

取消引用将参考点的值返回到该位置。 要取消引用引用,只需使用$,@或%作为引用变量的前缀,具体取决于引用是指向标量,数组还是哈希。 以下是解释这个概念的例子 -

#!/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很容易知道它的类型,如果它的参数是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)

引用函数 (References to Functions)

如果您需要创建一个信号处理程序,以便通过在该函数名前加上\&而引用一个函数,并且引用该引用,您只需要使用&符号&前缀引用变量,就可能发生这种情况。 以下是一个例子 -

#!/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