标量参考

一个参考是一个标量变量(一个由 $ 前缀),其是指一些其它数据。

my $value     = "Hello";
my $reference = \$value;
print $value;     # => Hello
print $reference; # => SCALAR(0x2683310)

要获取引用的数据,请取消引用它。

say ${$reference};                  # Explicit prefix syntax
say $$reference;                    # The braces can be left out (confusing)

Version >= 5.24.0

新的后缀解除引用语法,默认情况下从 v5.24 开始提供

use v5.24;
say $reference->$*; # New postfix notation

然后可以像原始变量一样改变这个去参考值

${$reference} =~ s/Hello/World/;
print ${$reference};  # => World
print $value;         # => World

参考总是真实的 - 即使它所指的值是假的(如 0"")。

你可能需要标量参考如果:

  • 你希望将字符串传递给函数,并让它为你修改该字符串而不是返回值。

  • 你希望明确避免 Perl 在函数传递的某个时刻隐式复制大字符串的内容(特别是在没有写时复制字符串的旧 Perls 上相关)

  • 你希望从传达内容的字符串中消除具有特定含义的字符串式值的歧义,例如:

    • 从文件内容中消除文件名的歧义
    • 消除返回的错误字符串中返回的内容的歧义
  • 你希望实现一个轻量级的内部对象模型,其中传递给调用代码的对象不携带用户可见的元数据:

    our %objects;
    my $next_id = 0;
    sub new { 
       my $object_id = $next_id++;
       $objects{ $object_id } = { ... }; # Assign data for object
       my $ref = \$object_id;
       return bless( $ref, "MyClass" );
    }