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" };
    
  • 取消引用

    解引用将值从参考点返回到位置。要取消引用的引用,只需使用$,@或%作为引用变量的前缀,具体取决于引用是指向标量,数组还是哈希。以下是解释概念的示例-
    
    $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";
    
    尝试一下
    如果不确定变量类型,则可以使用ref轻松地了解其类型,如果其参数是引用,则返回以下字符串之一。否则,它返回false-
    • SCALAR
    • ARRAY
    • HASH
    • CODE
    • GLOB
    • REF
    让我们尝试以下示例-
    
    $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";
    
    尝试一下
  • 循环引用

    当两个引用包含彼此的引用时,将发生循环引用。创建引用时必须小心,否则循环引用可能会导致内存泄漏。以下是一个例子-
    
     my $foo = 100;
     $foo = \$foo;
     
     print "Value of foo is : ", $foo, "\n";
    
    尝试一下
  • 函数引用

    如果您需要创建一个信号处理程序,则可能会发生这种情况,因此您可以通过在函数名称前添加\&来生成对该函数的引用,并取消引用该引用,您只需要使用&前缀为引用变量加前缀即可。以下是一个例子-
    
    # 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);
    
    尝试一下