Problème en perl [Résolu/Fermé]

Signaler
Messages postés
13
Date d'inscription
dimanche 9 décembre 2007
Statut
Membre
Dernière intervention
5 janvier 2009
-
Messages postés
13
Date d'inscription
dimanche 9 décembre 2007
Statut
Membre
Dernière intervention
5 janvier 2009
-
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

Messages postés
13
Date d'inscription
dimanche 9 décembre 2007
Statut
Membre
Dernière intervention
5 janvier 2009

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.
Messages postés
21331
Date d'inscription
jeudi 4 novembre 2004
Statut
Modérateur, Contributeur sécurité
Dernière intervention
30 octobre 2019
3 544
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__
Messages postés
21331
Date d'inscription
jeudi 4 novembre 2004
Statut
Modérateur, Contributeur sécurité
Dernière intervention
30 octobre 2019
3 544
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__
Messages postés
13
Date d'inscription
dimanche 9 décembre 2007
Statut
Membre
Dernière intervention
5 janvier 2009

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.
Messages postés
13
Date d'inscription
dimanche 9 décembre 2007
Statut
Membre
Dernière intervention
5 janvier 2009

J'ai tout testé, c'est exactement ce que je voulais.
Messages postés
21331
Date d'inscription
jeudi 4 novembre 2004
Statut
Modérateur, Contributeur sécurité
Dernière intervention
30 octobre 2019
3 544
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__
Messages postés
13
Date d'inscription
dimanche 9 décembre 2007
Statut
Membre
Dernière intervention
5 janvier 2009

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

Messages postés
21331
Date d'inscription
jeudi 4 novembre 2004
Statut
Modérateur, Contributeur sécurité
Dernière intervention
30 octobre 2019
3 544
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__
Messages postés
13
Date d'inscription
dimanche 9 décembre 2007
Statut
Membre
Dernière intervention
5 janvier 2009

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
Messages postés
21331
Date d'inscription
jeudi 4 novembre 2004
Statut
Modérateur, Contributeur sécurité
Dernière intervention
30 octobre 2019
3 544
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__
Messages postés
13
Date d'inscription
dimanche 9 décembre 2007
Statut
Membre
Dernière intervention
5 janvier 2009

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