Perl - 引用(References)介绍

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
点我分享笔记