[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
Ven 22 Juil 13:34:50 CEST 2016
Damien Krotkine wrote on Thu, Jul 21, 2016 at 07:15:29PM +0200
>
>
> 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.
Ok mais je croyais que pour importer une fonction dans le namespace,
il fallait le spécifier explicitement en paramètre, ici
use Encode('encode');
J'ai l'impression que cet import à la demande ne marche que si
l'export correspondant est fait via la variable @EXPORT_OK ? À moins
que ce soit la présence ou non de liste d'import qui fasse la
différence, d'où la liste vide pour explicitement ne rien importer ?
>
> Pour régler ça, il suffit de faire:
>
> use Encode ();
>
> Qui charge le module Encode, mais n'importe rien.
Merci, ça marche.
>
> >
> >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;
> >}
> >
> >
> >
>
> _______________________________________________
> Perl mailing list
> Perl at mongueurs.net
> http://listes.mongueurs.net/mailman/listinfo/perl
--
Plus d'informations sur la liste de diffusion Perl