引用相等的字符串

4
在 Perl 中,如果我创建了两个数组元素的引用,则这两个指针是相等的。
my $ref1 = \$array[0];
my $ref2 = \$array[0];
print "$ref1\n$ref2";

对于存储字符串的变量的两个引用,这些指针是相等的。

如果我创建了两个变量并在其中存储相等的字符串,则这些引用不相等。

为什么它们不相等?相同的数据存储在不同的位置吗?

Perl是否引用变量而不是内存位置?

在Java中,如此处所示,四个相等的字符串指向相同的内存位置。

请有人解释一下吗?

1个回答

7
如果您对一个变量进行多次引用,它们都将指向同一内存位置。
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出版社

1
“面向对象的Perl”很不错,但自1999年以来就没有更新过了。Perl 5.0才在1994年开始支持面向对象编程;Damian一直处于Perl的前沿,并已经致力于开发Perl 6多年。我认为有关面向对象Perl的最佳文献是现代Perl。到目前为止,最新版本始终可在线获取;第四版在此HTML链接 - Borodin
@Borodin 我同意,但我特别提到了引用章节。那部分仍然非常现代化。 - simbabque
当然可以。我推荐 Damian Conway 写的几乎所有东西。而且 Perl 6 真是太棒了:迄今为止我见过的最好的语言。 - Borodin

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接