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

Langage Perl Discussion :

Problème nom package


Sujet :

Langage Perl

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2011
    Messages
    77
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2011
    Messages : 77
    Par défaut Problème nom package
    Bonjour je rappelle que je suis novice en perl et programmation, voici mon algo :
    - input : fichier texte contenant un texte par ligne avec des balises xml
    - output : 3 fichiers textes (1 avec les textes en anglais, 1 en français et 1 autre avec les autres langues).

    sauf que dans l'output je ne veux afficher que certains contenus des balises xml (class, abs, title). Mon problème se situe ici, quand je lance mon programme l'invite de commande affiche "Global symbol "$CLASS requires explicite package name at test.pl line..." et ce pour chaque ligne où une variable apparait dans mon code.

    Voici mon code dans sa totalité :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    #!/usr/bin/perl;
    use locale;
    use strict;
    use strict;
     
    use open IN => ":utf8", OUT => ":utf8";
     
    @ARGV = ("corpus-A61K.txt");
    while (<>) {
     
    	if (my ($chaine1) = $_ =~ /^<(.*\d+)>(.*)<ttp lng='eng'>(.*)<\/ttp>(.*)<reseng>(.*)<\/reseng>(.*)$/){
    		$CLASS = $1;
    		$TITLE = $3;
    		$ABS = $5;
    		open (EN, ">>en-A61K.txt");  # Ajout à la fin du fichier
    		print EN "<title lang='eng'>".$TITLE."<\/title><abstract lang='eng'>".$ABS."<\/abstract><class>".$CLASS."<\/class>\n";
    	}
    	elsif ($ligne =~ /^<(.*\d+)>(.*)<ttp lng='fre'>(.*)<\/ttp>(.*)<reseng>(.*)<\/reseng>(.*)$/){
    		$CLASS = $1;
    		$TITLE = $3;
    		$ABS = $5;
    		open (EN, ">>en-A61K.txt");  # Ajout à la fin du fichier
    		print EN "<abstract lang='eng'>".$ABS."<\/abstract><class>".$CLASS."<\/class>\n";
    	}
    	elsif (my ($chaine1) = $_ =~ /^<(.*\d+)>(.*)<ttp lng='fre'>(.*)<\/ttp>(.*)<resfre>(.*)<\/resfre>(.*)$/){
    		$CLASS = $1;
    		$TITLE = $3;
    		$ABS = $5;
    		open (FR, ">>fr-A61K.txt");  # Ajout à la fin du fichier
    		print FR "<title lang='fre'>".$TITLE."</title><abstract lang='fre'>".$ABS."</abstract><class>".$CLASS."</class>\n";
    	}
    	elsif ($ligne =~ /^<(.*\d+)>(.*)<ttp lng='eng'>(.*)<\/ttp>(.*)<resfre>(.*)<\/resfre>(.*)$/){
    		$CLASS = $1;
    		$TITLE = $3;
    		$ABS = $5;
    		open (FR, ">>fr-A61K.txt");  # Ajout à la fin du fichier
    		print FR "<abstract lang='fre'>".$ABS."</abstract><class>".$CLASS."</class>\n";
    	}
    	else {
    		open (UNK, ">>unk-A61K.txt");  # Ajout à la fin du fichier
    		print UNK "$_";
    	}
     }
    Merci d'avance de votre aide

  2. #2
    Expert confirmé

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2009
    Messages
    3 577
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 59
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Avril 2009
    Messages : 3 577
    Par défaut
    C'est bien de vouloir est strict en perl, mais une fois suffit

    Remplace le 2e

    par un

    Sinon, tu DOIS déclarer toutes tes variables, soit avec my (de préférence), soit avec our (seulement si c'est nécessaire, ce qui est rarement le cas, même pour les variables dont l'étendue concerne tout le script).

  3. #3
    Expert confirmé

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2009
    Messages
    3 577
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 59
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Avril 2009
    Messages : 3 577
    Par défaut
    Par ailleurs, je ne comprends pas bien ton écriture :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    	if (my ($chaine1) = $_ =~ /^<(.*\d+)>(.*)<ttp lng='eng'>(.*)<\/ttp>(.*)<reseng>(.*)<\/reseng>(.*)$/){
    		$CLASS = $1;
    		$TITLE = $3;
    		$ABS = $5;
    Je pense en fait que tu n'as pas compris l'écriture du style

    my ($variables) = /regexp/

    Ce que tu veux faire s'écrit en fait :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    	if (my ($CLASS, undef, $TITLE, undef, $ABS) = /^<(.*\d+)>(.*)<ttp lng='eng'>(.*)<\/ttp>(.*)<reseng>(.*)<\/reseng>(.*)$/) {
    Ou encore mieux, pour éviter la capture des 2e et 4e parenthèse, utiliser la regexp suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    	if (my ($CLASS, $TITLE, $ABS) = /^<(.*\d+)>(?:.*)<ttp lng='eng'>(.*)<\/ttp>(?:.*)<reseng>(.*)<\/reseng>(?:.*)$/) {

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2011
    Messages
    77
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2011
    Messages : 77
    Par défaut
    J'ai fait les changements et il s'affiche :

    "my" variable $CLASS masks earlier declaration in same scope...
    "my" $TITLE ...

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2011
    Messages
    77
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2011
    Messages : 77
    Par défaut
    Cela dit le code fait ce que je veux et où je veux.

    Merci beaucoup Philou67430 !

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2011
    Messages
    77
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2011
    Messages : 77
    Par défaut
    Problème résolu il suffisait que je modifie le nom des variables à chaque 'if' $CLASS1 $TITLE1
    $CLASS2...

    J'ai fait mon premier pas toute seule dans le domaine des variables

    Merci à vous !

  7. #7
    Responsable Perl et Outils

    Avatar de djibril
    Homme Profil pro
    Inscrit en
    Avril 2004
    Messages
    19 822
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 19 822
    Par défaut
    Voici un code amélioré non testé

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    #!/usr/bin/perl;
    use warnings;
    use strict;
     
    my $fichier_en     = 'en-A61K.txt';
    my $fichier_fr     = 'fr-A61K.txt';
    my $fichier_unk    = 'unk-A61K.txt';
    my $fichier_corpus = 'corpus-A61K.txt';
    open my $fh_corpus, '<:utf8',  $fichier_corpus or die "Impossible de lire $fichier_corpus\n";
    open my $fh_fr,     '>>:utf8', $fichier_fr     or die "Impossible de lire $fichier_fr\n";
    open my $fh_en,     '>>:utf8', $fichier_en     or die "Impossible de lire $fichier_en\n";
    open my $fh_unk,    '>>:utf8', $fichier_unk    or die "Impossible de lire $fichier_unk\n";
    my ( $CLASS, $TITLE, $ABS );
     
    while ( my $ligne = <$fh_corpus> ) {
     
      if ( ( $CLASS, $TITLE, $ABS )
        = $ligne =~ /^<.*\d+>(.*)<ttp lng='eng'>.*<\/ttp>(.*)<reseng>.*<\/reseng>(.*)$/ )
      {
        print {$fh_en} "<title lang='eng'>" 
          . $TITLE
          . "<\/title><abstract lang='eng'>"
          . $ABS
          . "<\/abstract><class>"
          . $CLASS
          . "<\/class>\n";
      }
      elsif ( ( $CLASS, $TITLE, $ABS )
        = $ligne =~ /^<.*\d+>(.*)<ttp lng='fre'>.*<\/ttp>(.*)<reseng>.*<\/reseng>(.*)$/ )
      {
        print {$fh_en} "<abstract lang='eng'>" . $ABS . "<\/abstract><class>" . $CLASS . "<\/class>\n";
      }
      elsif ( ( $CLASS, $TITLE, $ABS )
        = $ligne =~ /^<.*\d+>(.*)<ttp lng='fre'>.*<\/ttp>(.*)<resfre>.*<\/resfre>(.*)$/ )
      {
        print {$fh_fr} "<title lang='fre'>" 
          . $TITLE
          . "</title><abstract lang='fre'>"
          . $ABS
          . "</abstract><class>"
          . $CLASS
          . "</class>\n";
      }
      elsif ( ( $CLASS, $TITLE, $ABS )
        = $ligne =~ /^<.*\d+>(.*)<ttp lng='eng'>.*<\/ttp>(.*)<resfre>.*<\/resfre>(.*)$/ )
      {
        print {$fh_fr} "<abstract lang='fre'>" . $ABS . "</abstract><class>" . $CLASS . "</class>\n";
      }
      else {
        print {$fh_unk} $ligne;
      }
    }

  8. #8
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2011
    Messages
    77
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2011
    Messages : 77
    Par défaut
    Citation Envoyé par djibril Voir le message
    Voici un code amélioré non testé

    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;
    use warnings;
    use strict;
     
    my $fichier_en     = 'en-A61K.txt';
    my $fichier_fr     = 'fr-A61K.txt';
    my $fichier_unk    = 'unk-A61K.txt';
    my $fichier_corpus = 'corpus-A61K.txt';
    open my $fh_corpus, '<:utf8',  $fichier_corpus or die "Impossible de lire $fichier_corpus\n";
    open my $fh_fr,     '>>:utf8', $fichier_fr     or die "Impossible de lire $fichier_fr\n";
    open my $fh_en,     '>>:utf8', $fichier_en     or die "Impossible de lire $fichier_en\n";
    open my $fh_unk,    '>>:utf8', $fichier_unk    or die "Impossible de lire $fichier_unk\n";
    my ( $CLASS, $TITLE, $ABS );
    sachant que mon fichier corpus-A61K.txt n'est pas du tout en utf8 est-il nécessaire d'écrire "'>>:utf8', $fichier..." ?

    Merci

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

Discussions similaires

  1. [ClassLoader] Chargement dynamique d'une classe -> problème avec packages !
    Par ymerej dans le forum API standards et tierces
    Réponses: 9
    Dernier message: 31/05/2006, 21h37
  2. probléme de package dans eclipse
    Par bf83 dans le forum Eclipse Java
    Réponses: 1
    Dernier message: 13/04/2006, 14h29
  3. [Eclipse 3.1] Problème de package
    Par yakanet dans le forum Eclipse Java
    Réponses: 2
    Dernier message: 24/02/2006, 14h53
  4. problème nom de champ = mot clé
    Par JYH dans le forum Bases de données
    Réponses: 1
    Dernier message: 05/12/2005, 12h13
  5. [servlet] [jsp] problème de package
    Par Erreip dans le forum Eclipse Java
    Réponses: 2
    Dernier message: 08/11/2005, 10h54

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