Problème en perl

Résolu
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

  • Votes
  • Date
  • Date décroissante
  1. 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.
    1. Modérateur
      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__
      
      1. Modérateur
        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__
        
        1. 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.
          1. Modérateur
            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__
            1. 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
              
              
              1. Modérateur
                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__
                
                1. 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
                  1. Modérateur
                    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__
                    
                    1. 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