J'ai une fonction pour convertir des documents dans différents formats, qui appelle ensuite une autre fonction basée sur le document de type. C'est assez simple pour tout ce qui concerne les documents HTML qui nécessitent un peu de nettoyage, et que le nettoyage est différent en fonction d'où il vient. J'ai donc eu l'idée que je pourrais passer une référence à un sous-programme à la fonction de conversion afin que l'appelant ait la possibilité de modifier le HTML, un peu comme ça (je ne suis pas au travail donc ce n'est pas copier-coller) :Comment puis-je modifier une référence scalaire transmise à une référence de sous-programme?
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);
}
qui est alors appelé par:
Converter->new->convert("./whatever.html", sub { s/<html>/<xml>/i });
J'ai essayé deux choses différentes le long de ces lignes, mais je continue à obtenir « utilisation de la valeur non initialisée en substitution (s ///) '. Y a-t-il un moyen de faire ce que j'essaie de faire?
Merci
Avant de lire l'une des réponses ci-dessous: vous pouvez essayer d'ajouter des instructions d'impression à chaque niveau de sous-programme, pour voir si ce que vous obtenez comme arguments correspond vraiment à ce que vous pensez devrait être. ** Astuce: l'instruction d'impression à l'intérieur de la substitution coderef devrait vous conduire à la réponse. ** – Ether