引用相等的字符串

时间:2016-08-12 08:19:06

标签: perl pointers reference

在Perl中,如果我创建两个对数组元素的引用,则两个指针是相等的。

my $ref1 = \$array[0];
my $ref2 = \$array[0];
print "$ref1\n$ref2";

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

如果我创建两个存储相等字符串的变量,则引用不相等。

为什么他们不相同?相同的数据存储在不同的地方?

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

在Java中,正如您所看到的here,四个相等的字符串指的是相同的内存位置。

有人可以解释一下吗?

1 个答案:

答案 0 :(得分: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中,字符串是对象。 Java知道可用的对象。定义字符串时,它会生成一个对象。 Perl的情况并非如此。字符串和数字只是值,当你使用它们时它们会被放入内存中。

Perl所做的是跟踪其引用。它将通过删除未使用的值来释放内存,但前提是这些值不再存在于正在运行的程序中的其他位置。这称为引用计数

您可以阅读perlref中的参考资料。在Damian Conway at Mannings面向对象的Perl 一书中,所有这些都有很好的解释。