Если бы это был я, я бы не стал изменять скалярную ссылку и просто возвращал измененное значение:
sub _convert_html
{
my ($self, $filename, $coderef) = @_;
my $html = $self->slurp($filename);
$html = $coderef->( $html ); #this modifies the html
$self->save_to_file($filename, $html);
}
Однако, если вы хотите изменить аргументы подпрограммы, стоит знать, что все под аргументы передаются по ссылке в Perl (элементы @_
связываются с аргументами суб-вызова). Таким образом, ваш конверсионный саб может выглядеть так:
sub { $_[0] =~ s/<html>/<xml>/ }
Но если вы действительно хотите работать с $_
, как у вас в желаемом примере кода, вам нужно сделать _convert_html()
похожим на:
sub _convert_html
{
my ($self, $filename, $coderef) = @_;
my $html = $self->slurp($filename);
$coderef->() for $html;
$self->save_to_file($filename, $html);
}
for
- это простой способ правильно локализовать $_
. Вы также можете сделать:
sub _convert_html
{
my ($self, $filename, $coderef) = @_;
local $_ = $self->slurp($filename);
$coderef->();
$self->save_to_file($filename, $_);
}