Линия my $ref_to_getHeading = \getHeading;
не делает то, что вы думаете, она делает. Чтобы взять ссылку на подпрограмму:
my $ref_to_getHeading = \&getHeading; # note the &
Итак, вы на самом деле звонили getHeading
и сохраняли результат. Поскольку вы не передали аргументы, вы получили предупреждение о неопределенном значении.
Однако подстановка никогда не вызовет coderef, для этого вам нужно добавить модификатор e
, чтобы выполнить текст замены через eval:
$html =~ s/.../join '' => getHeading($2), $1, $3, $4, getHeading($2)/me;
Вы можете столкнуться с проблемами здесь, когда getHeading
сбрасывает параметры совпадения слишком рано. В таком случае попробуйте написать это так:
$html =~ s{...}{
my $body = $1 . $3 . $4;
my $heading = getHeading($2);
$heading . $body . $heading
}me;
Смена скобок для s///
не требовалась, просто мне проще читать многострочный фигурный блок.