У меня есть функция преобразования документов в разные форматы, которые затем вызывает другую функцию на основе документа типа. Это довольно прямолинейно для всего, кроме документов HTML, требующих немного очистки, и что очистка различна в зависимости от того, откуда она взялась. Поэтому у меня возникла идея, что я могу передать ссылку на подпрограмму функции конвертации, чтобы вызывающая сторона имела возможность изменять HTML, вроде как (я не работаю, так что это не копирование и вставка) :Как изменить скалярную ссылку, переданную в ссылку подпрограммы?
package Converter;
...
sub convert
{
my ($self, $filename, $coderef) = @_;
if ($filename =~ /html?$/i) {
$self->_convert_html($filename, $coderef);
}
}
sub _convert_html
{
my ($self, $filename, $coderef) = @_;
my $html = $self->slurp($filename);
$coderef->(\$html); #this modifies the html
$self->save_to_file($filename, $html);
}
, который затем вызывается:
Converter->new->convert("./whatever.html", sub { s/<html>/<xml>/i });
Я пытался несколько различных вещей вдоль этих линий, но я продолжаю получать «использование неинициализированного значения в замещении (s ///). Есть ли способ сделать то, что я пытаюсь сделать?
Благодаря
Перед тем, как прочитать любой из следующих ответов: Вы можете попробовать добавить некоторые операторы печати на каждом уровне подпрограммы, чтобы увидеть, если то, что вы получаете в качестве аргументов действительно соответствует тому, что вы думаете, должно быть. ** Подсказка: заявление печати внутри подстановки coderef должно привести вас к ответу. ** – Ether