[Perl] Définir une fonction qui porte le même nom dans un module, que celle dans un autre module

Dominique Asselineau asseline at telecom-paristech.fr
Mer 20 Juil 17:02:33 CEST 2016


Bonjour,

En souhaitant utiliser le module Encode qui définit la fonction
encode, je me heurte au fait que mon propre module définit également
une fonction du même nom.  Il ne s'agit donc pas de redéfinir la
fonction Encode::encode mais de créer une autre occurrence de cette
fonction qui n'a pas tout à fait le même fonctionnement.  Vous
pourriez me proposer de la renommer autrement mais comme ce module est
abondamment utilisé, je ne me vois pas trop retoucher à tous les
modules et programmes qui y font appel.

En pratique ça fonctionne tout de même mais j'ai un warning dans les
logs qui laisse penser qu'un bug à retardement pourrait bien survenir
à l'occasion d'une mise à jour de Perl.  Et puis j'apprécie que les
choses soient le plus propre possible.

Voici un ECM pour caractériser le problème.  Comme on le voit, la
fonction encode du module Encode n'est pas importée mais explicitement
qualifiée lors de son appel.  La définition de la fonction de mon
module ne devrait donc pas entrer en conflit avec celle du module
Encode.  J'ai parcouru la doc perlsub, j'ai bien remarqué "use subs"
mais qui ne répond pas au problème.



fichier Encoder.pm :
package Encoder;

use Modern::Perl;
use feature qw/unicode_strings/;

use base('Exporter');

our @EXPORT_OK = qw/encode/;

use Encode;

sub encode {
  my( $encoding, $string ) = @_;

  return Encode::encode( $encoding, $string );
}

1;



puis le programme :

#!/usr/bin/perl

use Modern::Perl;
use utf8;
use feature qw/unicode_strings/;

use Encoder qw/encode/;

main:
{
  my $string = "l'œuf et la poule";

  print( encode( 'UTF-8', $string ).$/ );

  exit 0;
}



-- 


Plus d'informations sur la liste de diffusion Perl