【问题标题】:References to equal strings对相等字符串的引用
【发布时间】:2016-08-12 08:19:06
【问题描述】:

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

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

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

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

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

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

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

谁能解释一下?

【问题讨论】:

    标签: perl pointers reference


    【解决方案1】:

    如果你对一个变量进行多次引用,它们都会指向同一个内存位置。

    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一书中对所有这些工作原理也有很好的解释。

    【讨论】:

    • "Object Oriented Perl" 很不错,但自 1999 年以来就没有更新过。Perl 在 Perl 5.0 中首次成为面向对象仅在 1994 年; Damian 一直处于 Perl 的最前沿,并且多年来一直致力于 Perl 6。我认为关于面向对象 Perl 的最佳写作是 Modern Perl。到目前为止,最新版本一直在线提供;第四个是here in HTML
    • @Borodin 我同意,但我在这里专门提到了参考章节。那部分仍然是最新的。
    • 是的,当然。我推荐几乎所有 Damian Conway 写的东西。 Perl 6 非常棒:迄今为止我见过的最好的语言。
    猜你喜欢
    • 1970-01-01
    • 2015-06-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多