Problèmes Perl

MrCanard Messages postés 22 Statut Membre -  
killtiret9 Messages postés 1 Statut Membre -
Bonjour,

J'ai un petit soucis, je cherche à ce que quand j'ai deux lignes égales, je supprime les deux
lignes, en fait j'ai une liste avec des doublons et des uniques (ce sont des codes mais ça
ressemble à des mots ^^) et ce que je cherche c'est supprimer les lignes qui sont égales
de façon à obtenir que les lignes qui n'apparaissent qu'une fois.

Voici mon code :

open (my $fic9, "< Jobs.txt");

my @tab = <$fic9>;
my $i = 0;
my $j = 0;

foreach $i (@tab) {
if ($i =~ "") {
}
else {
foreach $j (@tab) {
if($i == $j) {
$i = "";
$j = "";
exit;
}
else {
}
}
}
}

print "\nSuppression quand des repetitions ...\n\n";
system("pause");

close $fic9;

Je débute depuis peu à Perl et je manque encore d'entrainement :)
Merci d'avance pour votre aide ;)
Configuration: Windows XP
Firefox 3.0

4 réponses

  1. davlar Messages postés 75 Statut Membre 57
     
    Voici la réponse. (Elle est à la fin)

    http://www.commentcamarche.net/forum/affich 213976 suppression de doublons perl

    Ou

    Supprimer les doublons dans une liste

    Ce module permet de supprimer les entrées en double dans un tableau.

    use List::Uniq qw(:all);

    open (my $fic9, "< Jobs.txt");
    my @list = <$fic9>;

    my @uniq_list = uniq(@list);

    foreach my $line(@uniq_list) {
    print "$line\n";
    }

    Dave
    0
    1. MrCanard
       
      Juste une question :)

      Ta réponse me supprime un ou les deux du doublons ?

      En tout cas, merci d'avoir répondu

      Canard
      0
  2. davlar Messages postés 75 Statut Membre 57
     
    Hummm.

    Effectivement, ça ne règle pas tout a fait ton problème. Ma présente réponse laisse une l'une des 2 lignes.

    Dave
    0
  3. MrCanard Messages postés 22 Statut Membre 1
     
    Ouais c'est ça le problème ^^, c'est que j'arrive pas à laisser aucune des deux lignes ...

    Merci quand même de te décarcasser pour moi :)

    Canard
    0
  4. davlar Messages postés 75 Statut Membre 57
     
    Tient: C'est pas très élégant mais ça marche:

    open (my $fic1, "< Jobs.txt");

    my @liste = (sort(<$fic1>));
    my @comparer = (sort(@liste));

    my @liste_unique = ();
    my $numArgs = $#liste +1;
    my $existeendouble = 0;

    foreach my $line(@liste)
    {
    for ($compteur = 0; $compteur < $numArgs; $compteur++)
    {
    $line =~ s/\s//g;
    @comparer[$compteur] =~ s/\s//g;

    if($line eq @comparer[$compteur])
    {
    $existeendouble += 1;
    }
    $compteur +1;
    }

    if ($existeendouble < 2)
    {
    push( @liste_unique, $line);
    }
    $existeendouble = 0;
    }

    print "Unique: @liste_unique\n";

    A+ Dave
    0
    1. MrCanard Messages postés 22 Statut Membre 1
       
      Merci beaucoup il m'a l'air d'être plutôt pas mal, seul une question :) je l'ai testé et j'ai ça :

      Scalar value @comparer[$compteur] better written as $comparer[$compteur] at C:\Documents and Settings\BOUAGUME\Mes documents\...\Recup_Job_Deux.pl line 273.
      Scalar value @comparer[$compteur] better written as $comparer[$compteur] at C:\Documents and Settings\BOUAGUME\Mes documents\...\Recup_Job_Deux.pl line 275.
      Global symbol "$compteur" requires explicit package name at C:\Documents and Settings\BOUAGUME\Mes documents\...\Recup_Job_Deux.pl line 270.
      Global symbol "$compteur" requires explicit package name at C:\Documents and Settings\BOUAGUME\Mes documents\...\Recup_Job_Deux.pl line 270.
      Global symbol "$compteur" requires explicit package name at C:\Documents and Settings\BOUAGUME\Mes documents\...\Recup_Job_Deux.pl line 270.
      Global symbol "$compteur" requires explicit package name at C:\Documents and Settings\BOUAGUME\Mes documents\...\Recup_Job_Deux.pl line 273.
      Global symbol "$compteur" requires explicit package name at C:\Documents and Settings\BOUAGUME\Mes documents\...\Recup_Job_Deux.pl line 275.
      Global symbol "$compteur" requires explicit package name at C:\Documents and Settings\BOUAGUME\Mes documents\...\Recup_Job_Deux.pl line 279.

      quand je l'éxécute dans l'invite de commande, car en direct il veut pas ^^ (j'ai bien rajouté un system("pause"); à la fin xD)
      en tout cas merci de ton aide ;)

      Canard
      0
      1. davlar Messages postés 75 Statut Membre 57 > MrCanard Messages postés 22 Statut Membre
         
        Fait la modification suivante:

        Remplace --> @comparer[$compteur]

        par --> $comparer[$compteur]

        Et met un entête du genre : #!C:\perl\bin\perl.exe -X

        Tu n'auras plus les avertissements.

        A+

        Dave
        0
    2. killtiret9 Messages postés 1 Statut Membre
       
      faux pas de handle de fichier il ne peut ouvrir jobs.txt déjà pour commencer
      0