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

Damien Krotkine dkrotkine at gmail.com
Jeu 21 Juil 19:15:29 CEST 2016



Dominique Asselineau wrote:
> 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.

Tu as un warning parce que quand tu fais "use Encode" dans ton module 
Encoder, ça importe "encode" dans le namespace de ton module, qui se 
prend donc un warning quand il redefini sub encode.

Pour régler ça, il suffit de faire:

use Encode ();

Qui charge le module Encode, mais n'importe rien.

>
> 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;

Du coup ici  ^  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