[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 19:25:39 CEST 2016


Laurent Rosenfeld wrote on Fri, Jul 22, 2016 at 01:49:51PM +0200
> Si tu passes une liste vide à use, alors aucune fonction n'est importée. De
> coup tu peux y accéder uniquement avec le nom complet Encode::encode.

C'est clairement ce que je voulais faire pour justement ne pas risquer
de conflit.

Comme je n'aime pas les choses qui se font implicitement, c'est une
source de bugs à retardement, je ne manquerai pas d'utiliser
systématiquement une liste vide pour précisément ne rien importer
(quand il n'y a rien à importer naturellement).

Merci.

Dominique

> 
> Bonne après-midi,
> Laurent.
> 
> 
> Le 22 juillet 2016 à 13:34, Dominique Asselineau <
> asseline at telecom-paristech.fr> a écrit :
> 
> > 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
> >
> > --
> > _______________________________________________
> > Perl mailing list
> > Perl at mongueurs.net
> > http://listes.mongueurs.net/mailman/listinfo/perl
> >

> _______________________________________________
> Perl mailing list
> Perl at mongueurs.net
> http://listes.mongueurs.net/mailman/listinfo/perl


-- 


Plus d'informations sur la liste de diffusion Perl