[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