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

Laurent Rosenfeld laurent.rosenfeld at googlemail.com
Ven 22 Juil 13:49:51 CEST 2016


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.

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
>
-------------- section suivante --------------
Une pièce jointe HTML a été nettoyée...
URL: <http://listes.mongueurs.net/mailman/private/perl/attachments/20160722/7916ebba/attachment.html>


Plus d'informations sur la liste de diffusion Perl