変更不可能な変数を作るには Readonly というモジュールが使えます。スピードに関してネガティブなことが書いてあるのですが,気になる向きは Readonly::XS を「追加で」インストールすると自動的にそちらが使われるようになります。
通常は,定数などを表現するのに使ったりしますが,
#!/usr/bin/perl
use strict;
use Readonly;
{
my $hash = { msg => 'hello, world' };
sub fetch {
Readonly::Scalar my $r => $hash;
$r;
}
}
my $r = fetch();
$r->{msg} = 'konnnichiwa';などのようにすると,きちんと「Modification of a read-only value attempted」と怒られます。mod_perl 環境などで変数が永続化するのを忘れていじっていると,どんどん変更されてしまっていやん,などのときに使えるかも。