gpt4 book ai didi

perl - 对相等字符串的引用

转载 作者:行者123 更新时间:2023-12-04 23:40:31 24 4
gpt4 key购买 nike

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

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

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

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

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

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

在 Java 中,如您所见 here , 四个相等的字符串指向相同的内存位置。

有人可以解释一下吗?

最佳答案

如果对一个变量进行多次引用,则所有引用都将指向相同的内存位置。

my $foo = 'foo';
my $ref1 = \$foo;
my $ref2 = \$foo;

say $ref1;
say $ref2;
$ref1背后的值(value)和 $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 的 Object Oriented Perl 一书中也有很好的解释,说明所有这些是如何工作的 at Mannings .

关于perl - 对相等字符串的引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38913200/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com