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" };
取消引用将参考点的值返回到该位置.要取消引用引用,只需使用$,@或%作为引用变量的前缀,具体取决于引用是指向标量,数组还是哈希.以下是解释概念&减去的例子;
#!/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