代码之家  ›  专栏  ›  技术社区  ›  Zaid

为什么'exists'要修改我的常数?

  •  7
  • Zaid  · 技术社区  · 15 年前

    这个 exists 函数can unexpectedly autovivify entries 在散列中。

    令我惊讶的是,这种行为也会延续到常数:

    use strict;
    use warnings;
    use Data::Dump 'dump';
    
    use constant data => {
                           'foo' => {
                                      'bar' => 'baz',
                                    },
                           'a'   => {
                                      'b'   => 'c',
                                    }
                         };
    
    dump data;   # Pre-modified
    
    print "No data for 'soda->cola->pop'\n" unless exists data->{soda}{cola}{pop};
    
    dump data;   # data->{soda}{cola} now sprung to life
    

    输出

    { a => { b => "c" }, foo => { bar => "baz" } }
    No data for 'soda->cola->pop'
    { a => { b => "c" }, foo => { bar => "baz" }, soda => { cola => {} } }
    

    我怀疑这是个虫子。这是特定于5.10.1的,还是其他版本的Perl的行为类似?

    2 回复  |  直到 9 年前
        1
  •  15
  •   Dave Cross    15 年前

    这是记录在案的行为。 perldoc constant 说:

    声明为常数的引用 可能指向的数据可能是

    use constant ARRAY => [ 1,2,3,4 ];
    print ARRAY->[1];
    ARRAY->[1] = " be changed";
    print ARRAY->[1];
    

    它指的是常数,而不是它所指的。

        2
  •  9
  •   Eugene Yarmash    15 年前

    Readonly 用于创建“真”常量。

    使用 constant pragma实际上是 inlinable subroutines . 这意味着在编译时,可以直接插入适当的标量常量来代替某些子例程调用。如果常量是一个引用,则没有什么可以阻止您更改它指向的数据。