IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Modules Perl Discussion :

Bareword "module::function" not allowed while "strict subs" in use at module.pm line 1


Sujet :

Modules Perl

  1. #1
    Nouveau membre du Club
    Inscrit en
    Avril 2009
    Messages
    44
    Détails du profil
    Informations forums :
    Inscription : Avril 2009
    Messages : 44
    Points : 32
    Points
    32
    Par défaut Bareword "module::function" not allowed while "strict subs" in use at module.pm line 1
    Bonjour,

    Voici l'erreur qui m'est renvoyé.

    En fait, je pense que c'est parce que j'appelle dans un fichier .pm une fonction d'un autre .pm Est-ce que cela n'est pas possible?

    DateFormat.pm :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    #!/usr/bin/perl -w
    package DateFormat;
    require Exporter; 
    use strict;
    use warnings;
     
    sub date_format{
    	### Function to have the date's format : AAAA-MM-DD
    	my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(time);
    	my $dateUs =  (1900+$year)."-".($mon+1)."-".$mday;
    	return $dateUs;
    }
    et PathFunctions.pm :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    #!/usr/bin/perl -w
    package PathFunctions;
    require Exporter;
    require DateFormat;
    use strict;
    use warnings;
     
    sub auto_path{
    	my $date = DateFormat::date_format;
    	my $n = "blabla";
    	my $dir = $n.$date;
    	return $dir
    }
    Et voici ce que cela me renvoi:
    f@ubuntu:$ perl PathFunctions.pm
    Bareword "DateFormat::date_format" not allowed while "strict subs" in use at PathFunctions.pm line 12.
    Execution of PathFunctions.pm aborted due to compilation errors.
    ______________EDIT________________

    J'ai modifié dans PathFunctions.pm le "require DateFormat;" par "use DateFormat;" et ça ne génère plus d'erreur mais est-ce correct ?

    Qu'est-ce qui est préférable - require ou use?

    Les deux fonctions vers le bas require et vers le bas use ont des tâches similaires, leur façon d'agir est cependant différente. require est chargé pour le déroulement d'un script (et cela à l'endroit où figure l'instruction require), tandis que use est déjà incorporé avant au moment de la compilation du script. Pour require vous passez donc simplement pendant l'exécution du script dans un autre script que vous faites compiler et exécuter puis vous revenez ensuite. Pour use par contre, vous obtenez après la compilation que Perl exécute avant chaque exécution du script, quasiment un grand script dont le code se compose de plusieurs fichiers modules. Cela a des conséquences. Ainsi des erreurs de syntaxe qui sont contenues dans un module incorporé avec use, sont repérées d'emblée et le script n'est pas du tout exécuté. Pour require par contre, il peut arriver que le script principal soit sans faute mais que le script incorporé contienne des erreurs de syntaxe. Celles-ci ne sont toutefois repérées que lorsque le script principal est déjà en cours d'exécution. Ce qui peut provoquer des états indéfinis. Il faut privilégier aujourd'hui dans la plupart des cas l'utilisation de use. Il y a il est vrai aussi des exceptions.

    Finalement les faits sont là: les deux fonctions existent aujourd'hui, et leur histoire diffère. require est plus ancien (était déjà interprété par Perl 4), tandis que use est proposé depuis la version 5. Dans la version 5, le concept des modules de Perl a été sensiblement élargi et n'a adopté que là, la forme étendue qu'on lui connaît aujourd'hui.[/QUOTE]

  2. #2
    Expert éminent
    Avatar de Jedai
    Homme Profil pro
    Enseignant
    Inscrit en
    Avril 2003
    Messages
    6 245
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Avril 2003
    Messages : 6 245
    Points : 8 586
    Points
    8 586
    Par défaut
    C'est parce que tu as utilisé require() et n'a pas mis les parenthèses dans DateFormat::date_format() : require() ne se déclenche qu'à l'exécution du script et pas à sa compilation (contrairement à use() ), donc le fait que DateFormat::date_format est une fonction n'était pas encore connu par perl lorsqu'il a rencontré ce nom à la compilation. Il a donc protesté que DateFormat::date_format était un "bareword" (un "mot nu", pas encore déclaré en tant que fonction, sans sigil, sans parenthèses derrière pour indiquer qu'il s'agit d'une fonction).

    L'emploi de use() à la place de require() a permis à perl de trouver la définition de DateFormat::date_format avant son utilisation, mais à mon avis le meilleur remède est de rajouter les parenthèses après le nom de la fonction. C'est l'une des raisons du conseil de PBP (Perl Best Practices) de toujours mettre des parenthèses après une fonction non-builtin.

    Par ailleurs, comme suggéré dans l'article que tu cites, il est pratiquement toujours préférable au jour d'aujourd'hui d'employer use() plutôt que require(), les situations où ce n'est pas le cas ne sont pas de celles qu'on rencontre usuellement en Perl.

    --
    Jedaï

  3. #3
    Nouveau membre du Club
    Inscrit en
    Avril 2009
    Messages
    44
    Détails du profil
    Informations forums :
    Inscription : Avril 2009
    Messages : 44
    Points : 32
    Points
    32
    Par défaut
    Encore une fois merci Jedai !
    Je n'avais même pas remarqué que je n'avais pas mis les parenthèses...

    Merci pour tes explications

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Bareword not allowed while "strict subs" in use at
    Par MohEllayali dans le forum Langage
    Réponses: 0
    Dernier message: 09/05/2009, 18h12
  2. String literal is not properly closed by a double-quote
    Par soufiane10 dans le forum Servlets/JSP
    Réponses: 5
    Dernier message: 24/03/2009, 23h22
  3. Réponses: 0
    Dernier message: 24/06/2008, 23h51
  4. Réponses: 8
    Dernier message: 12/11/2006, 07h00
  5. [win32] dllimport function not allowed
    Par FamiDoo dans le forum Windows
    Réponses: 13
    Dernier message: 28/07/2006, 10h13

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo