7

このexists関数は、ハッシュ内のエントリを予期せず自動活性化する可能性があります。

私が驚いたのは、この動作が定数にも引き継がれることです。

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も同様に動作しますか?

4

2 に答える 2

16

これは文書化された動作です。perldoc 定数は次のように述べています。

参照は定数として宣言できますが、このコードが示すように、参照は変更される可能性のあるデータを指している可能性があります。

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

それが参照するものではなく、一定であるのは参照です。

于 2010-10-20T10:03:00.877 に答える
9

おそらく、「真の」定数を作成するためにReadonlyを使用したいと思うでしょう。

constantプラグマを使用して作成された定数は、実際にはインライン化可能なサブルーチンです。これは、コンパイル時に適切なスカラー定数がサブルーチン呼び出しの代わりに直接挿入されることを意味します。定数が参照である場合、それが指すデータを変更することを妨げるものは何もありません。

于 2010-10-20T10:00:50.070 に答える