如果您对一个变量进行多次引用,它们都将指向同一内存位置。
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不同。在Perl中,字符串和数字只是值,并且只有在使用它们时才会放入内存。Perl会通过跟踪引用来释放内存,但只有当运行程序中不存在对这些值的引用时才会释放。这被称为“引用计数”。您可以在
perlref中了解有关引用的信息。在
Object Oriented Perl一书中,Damian Conway也很好地解释了所有这些内容。
请参考Mannings出版社。