Если вы хотите, чтобы вызывающий код мог изменять сообщение в хэше, вам нужно вернуть хеш по ссылке.Это делает то, что вы просили:
use strict;
use warnings;
sub self_expressing_hash {
my %h;
%h = (
msg => "hello",
express_yourself => sub { print $h{msg}, "\n" },
);
return \%h;
}
my $h = self_expressing_hash();
$h->{express_yourself}->();
$h->{msg} = 'goodbye';
$h->{express_yourself}->();
Однако это странная смесь - по сути, структура данных, которая содержит некоторое встроенное поведение.Звучит как объект для меня.Возможно, вам следует изучить ОО-подход для вашего проекта.