#!/usr/bin/perl
use strict;
use warnings;
use CGI;
use Data::Dumper;
use constant {
HASH_REF_LIST => [
{ id => 1 },
{ id => 2 },
{ id => 3 },
],
};
my $cgi = CGI->new();
my $id = $cgi->param('id') || '';
# 定数をコピーしてから操作したので安全のつもり
my @array = @{HASH_REF_LIST()};
for (@array) {
$_->{selected} = 1 if ($_->{id} == $id);
}
print $cgi->header;
print Dumper(\@array);
id クエリを受け取って、定数内のキーと一致すれば、そのキーに selected フラグを付ける。
まあプルダウンメニューとかで使われそうなコードです。
これを mod_perl で適当に id を変えて実行していると気づきます。
id と一致していないキーに seleted が付く時があると。。
原因は @array に定数を完全コピーをしたつもりが、
定数内がリファレンスになっているので外側だけしかコピーできていない点。
リファレンスを操作しちゃっているので、
当然それもキャッシュされて残ってしまいます。
解決策は、Storable::dclone とかでクローンを作るか、
自前でデリファレンスしてコピーする。
よく見ればわかりますが、なかなか気づきにくいのでご注意を。
0 件のコメント:
コメントを投稿