如果你对一个变量进行多次引用,它们都会指向同一个内存位置。
my $foo = 'foo';
my $ref1 = \$foo;
my $ref2 = \$foo;
say $ref1;
say $ref2;
$ref1 和$ref2 后面的值是一样的,因为它们都指向同一个变量。
SCALAR(0x171f7b0)
SCALAR(0x171f7b0)
如果您将字符串(不是包含字符串的同一个变量)分配给两个新变量,然后对它们进行引用,它们将是不同的。
my $foo = 'foo';
my $bar = 'bar';
my $ref1 = \$foo;
my $ref2 = \$bar;
say $ref1;
say $ref2;
这里,$ref1 和 $ref2 不一样,因为它们是对两个不同变量的引用。
SCALAR(0x20947b0)
SCALAR(0x2094678)
两个变量的值相等这一事实并不重要。
my $ref1 = \'foo';
my $ref2 = \'foo';
say $ref1;
say $ref2;
如果您直接引用值而不先将它们放入另一个变量中,情况也是如此。
SCALAR(0x1322528)
SCALAR(0x12ee6f0)
Perl 在内部处理内存,但它不像它有一个包含所有可能字符串的表,并且每当您创建引用时,它只使用该内存地址。
在 Java 中,字符串是对象。 Java 知道它可用的对象。当您定义一个字符串时,它会创建一个对象。在 Perl 中并非如此。字符串和数字只是值,使用时会被放入内存中。
Perl 所做的是跟踪它的引用。它将通过删除未使用的值来释放内存,但前提是不再引用这些值,这些值存在于正在运行的程序的其他位置。这称为 引用计数。
您可以阅读perlref 中的参考资料。 Damian Conway at Mannings 所著的Object Oriented Perl一书中对所有这些工作原理也有很好的解释。