Problème en perl

Résolu
eccomi Messages postés 13 Statut Membre -  
eccomi Messages postés 13 Statut Membre -
Bonjour à tous,

J'ai une petit problème d'insertion d'éléments dans des références à des tableaux:

J'aimerais n'avoir des références de tableaux ne contenant que deux éléments,
or mon code me donne une référence avec un seul élément en début et en fin de tableau:

use strict;

my @array = qw(manger dormir boire sortir voir aller manger manger);

my @array2= ();

my $cpt=0;

foreach my $x(@array){
push @{$array2[$cpt]}, $x;
$cpt++;
push @{$array2[$cpt]}, $x;
}

for my $i (@array2){

print "@$i\n";
}

résultat:

manger # c'est cette référence
manger dormir
dormir boire
boire sortir
sortir voir
voir aller
aller manger
manger manger
manger # et celle-ci que je cherche à supprimer

Si quelqu'un a une idée...

Merci.

11 réponses

  1. eccomi Messages postés 13 Statut Membre
     
    Bonsoir à tous,

    Au sujet du message précédent, j'aimerais également faire dans un autre programme des tableaux avec des références contenant 3 éléments chacune.

    Merci.
    0
  2. lami20j Messages postés 21506 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 571
     
    Salut,

    ton script
    #!/usr/bin/perl
    use strict;use warnings;
    
    my @array = qw(manger dormir boire sortir voir aller manger manger);
    
    my @array2= ();
    
    my $cpt=0;
    
    
    foreach my $x(@array){
            push @{$array2[$cpt]}, $x;
            $cpt++;
            push @{$array2[$cpt]}, $x;
    }
    
    shift @array2;
    pop @array2;
    for my $i (@array2){
    
            print "@$i\n";
    }
    __END__
    
    et le mien ;-)
    #!/usr/bin/perl
    use strict;use warnings;
    
    my @array = qw(manger dormir boire sortir voir aller manger manger);
    
    my @array2= ();
    
    for(my $i = 0;$i < @array -1;++$i){
      push @{$array2[$i]},$array[$i],$array[$i+1];
    }
    
    print "@$_\n" for(@array2);
    __END__
    
    et encore
    #!/usr/bin/perl
    use strict;use warnings;
    
    my @array = qw(manger dormir boire sortir voir aller manger manger);
    
    my @array2= ();
    
    for(my $i = 0;$i < @array -1;++$i){
      push @{$array2[$i]},@array[$i,$i+1];
    }
    
    print "@$_\n" for(@array2);
    __END__
    
    0
  3. lami20j Messages postés 21506 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 571
     
    et pour la 2ème question
    #!/usr/bin/perl
    use strict;use warnings;
    
    my @array = qw(manger dormir boire sortir voir aller manger manger);
    
    my @array2= ();
    
    for(my $i = 0;$i < @array -2;++$i){
      push @{$array2[$i]},@array[$i .. $i+2];
    }
    
    print "@$_\n" for(@array2);
    __END__
    
    0
  4. eccomi Messages postés 13 Statut Membre
     
    Bonsoir lami20j,

    Pour la deuxième fois tu me tires une épine du pied. Je n'ai pas encore testé, mais je sais que ça fonctionnera. Je me sens redevable.

    J'aurais une autre question: comment faire un tri alphabétique sur une telle structure? Par exemple en prenant le premier élément de chaque référence? J'ai essayé pas mal de choses, mais ...

    Encore merci.
    0
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. eccomi Messages postés 13 Statut Membre
     
    J'ai tout testé, c'est exactement ce que je voulais.
    0
  7. lami20j Messages postés 21506 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 571
     
    Voic pour le tri (avec 3 éléments par référence)
    #!/usr/bin/perl
    use strict;use warnings;
    
    my @array = qw(manger dormir boire sortir voir aller manger manger);
    
    my @array2= ();
    
    for(my $i = 0;$i < @array -2;++$i){
      push @{$array2[$i]},@array[$i .. $i+2];
    }
    
    my @tri = map { [map {sort  @$_ } $_] } @array2;
    
    print "*" x 5, " avant le tri ", "*" x 5,"\n";
    print "@$_\n" for( @array2);
    
    print "*" x 5, " après le tri ", "*" x 5,"\n";
    print "@$_\n" for( @tri);
    __END__
    
    et avec 2 éléments
    #!/usr/bin/perl
    use strict;use warnings;
    
    my @array = qw(manger dormir boire sortir voir aller manger manger);
    
    my @array2= ();
    
    for(my $i = 0;$i < @array -1;++$i){
      push @{$array2[$i]},@array[$i,$i+1];
    }
    
    my @tri = map { [map {sort  @$_ } $_] } @array2;
    
    print "*" x 5, " avant le tri ", "*" x 5,"\n";
    print "@$_\n" for( @array2);
    
    print "*" x 5, " après le tri ", "*" x 5,"\n";
    print "@$_\n" for( @tri);
    __END__
    0
  8. eccomi Messages postés 13 Statut Membre
     
    Merci! Ca à l'air un peu compliqué les map, j'ai pas encore appris.

    En fait ça fait un tri, mais pas alphabétique:

    2 éléments

    ***** après le tri *****
    dormir manger
    boire dormir
    boire sortir
    sortir voir
    aller voir
    aller manger
    manger manger
    
    


    3 éléments:

    Là c'est bon. On peut inverser l'ordre?

    ***** après le tri *****
    boire dormir manger
    boire dormir sortir
    boire sortir voir
    aller sortir voir
    aller manger voir
    aller manger manger
    
    
    0
  9. lami20j Messages postés 21506 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 571
     
    En fait ça fait un tri, mais pas alphabétique:

    pourquoi?

    dormir est bien avant manger
    boire avant dormir
    boire avant sortir
    etc.
    voilà pour inverser
    #!/usr/bin/perl
    use strict;use warnings;
    
    my @array = qw(manger dormir boire sortir voir aller manger manger);
    
    my @array2= ();
    
    for(my $i = 0;$i < @array -2;++$i){
      push @{$array2[$i]},@array[$i .. $i+2];
    }
    
    my @tri = map { [reverse map {sort  @$_ } $_] } @array2;
    
    print "*" x 5, " avant le tri ", "*" x 5,"\n";
    print "@$_\n" for( @array2);
    
    print "*" x 5, " après le tri ", "*" x 5,"\n";
    print "@$_\n" for( @tri);
    __END__
    
    0
  10. eccomi Messages postés 13 Statut Membre
     
    Excuse-moi, je me suis mal exprimé. Je voulais dire en comparant le premier caractère du premier élément de chaque liste, et se baser sur ça.

    Obtenir ça:

    aller manger manger
    aller manger voir
    aller sortir voir
    boire dormir manger
    boire dormir sortir
    boire sortir voir
    0
  11. lami20j Messages postés 21506 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 571
     
    Obtenir ça:

    aller manger manger
    aller manger voir
    aller sortir voir
    boire dormir manger
    boire dormir sortir
    boire sortir voir


    essaie ça
    #!/usr/bin/perl
    use strict;use warnings;
    
    my @array = qw(manger dormir boire sortir voir aller manger manger);
    
    my @array2= ();
    
    for(my $i = 0;$i < @array -2;++$i){
      push @{$array2[$i]},@array[$i .. $i+2];
    }
    
    
    my @tri = sort { $a->[0] cmp $b->[0]
                              ||
                     $a->[1] cmp $b->[1]
                              ||
                     $a->[2] cmp $b->[2]
    } map { [ map {sort  @$_ } $_] } @array2;
    
    print "*" x 5, " avant le tri ", "*" x 5,"\n";
    print "@$_\n" for( @array2);
    
    print "*" x 5, " après le tri ", "*" x 5,"\n";
    print "@$_\n" for( @tri);
    __END__
    
    0
  12. eccomi Messages postés 13 Statut Membre
     
    Merci lami20j!!

    Je me suis cassé la tête, mais j'aurais jamais trouvé seul... Enfin, tout ce que tu m'indiques, je ne l'oublierai plus, et pourrais m'en reservir :)

    Bonne soirée.

    eccomi
    0