Вы можете упростить несколько вещей, работая со значениями хеша, а не с ключами.Вы также хотите проверить другие типы ссылок, потому что слепое выполнение регулярных выражений для других типов ссылок, вероятно, не будет делать то, что вы хотели.
sub recursive_hash_replacement {
### unpack multiple args with list assignment:
my ($hash, $year) = @_;
### Loop through all the values in the hash ref.
for my $value (values %$hash) {
### If the value is another hash ref, call the function recursively.
if (ref $value) {
if (ref $value eq 'HASH') {
recursive_hash_replacement($value, $year);
}
else {
# handle other reftypes, or skip them, or throw an error
die "non hash reference: $value"
}
}
### otherwise, just update the value.
else {
$value =~ s{!YEAR!}{$year}g;
}
}
}
Наконец, работа с strict
хороша,работа с strict
и warnings
лучше, и будет ловить намного больше потенциальных ошибок.Наконец, иногда вы можете столкнуться с проблемами с синтаксисом косвенного объекта, поэтому используйте стандартные вызовы методов для конструкторов:
Config::General->new(-ConfigFile => \*DATA);
или, если вам нравится синтаксис косвенного объекта, сделайте его однозначным, добавив ::
кконец имени пакета:
new Config::General:: -ConfigFile => \*DATA;