[PERL] Supprimer caractère vide

[Résolu/Fermé]
Signaler
Messages postés
109
Date d'inscription
mercredi 16 juillet 2008
Statut
Membre
Dernière intervention
4 janvier 2011
-
Messages postés
109
Date d'inscription
mercredi 16 juillet 2008
Statut
Membre
Dernière intervention
4 janvier 2011
-
Bonjour,

Est ce que quelqu'un sait comment supprimer des cases vides dans un tableau en perl?
J'ai supprimé dans mon tableau les \n (=~ s/\n//g;), les espaces (=~ s/\s+//g;), les tabulations (s/^[ \t]*//;s/[ \t]*$// ). Mais j'ai toujours le même probleme.

Merci.

9 réponses

Messages postés
21331
Date d'inscription
jeudi 4 novembre 2004
Statut
Modérateur, Contributeur sécurité
Dernière intervention
30 octobre 2019
3 560
Salut,

essaie (je n'ai pas testé ;-)
@case_non_vide = grep { /.+/ } @case_vide;
1
Merci

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

CCM 41713 internautes nous ont dit merci ce mois-ci

Messages postés
21331
Date d'inscription
jeudi 4 novembre 2004
Statut
Modérateur, Contributeur sécurité
Dernière intervention
30 octobre 2019
3 560
Re,

ou
push $_,@case_non_vide for @case_vide;
1
Merci

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

CCM 41713 internautes nous ont dit merci ce mois-ci

Messages postés
109
Date d'inscription
mercredi 16 juillet 2008
Statut
Membre
Dernière intervention
4 janvier 2011
1
Je ne comprend pas ta commande lami20j.
Je dois déclarer @case_non_vide ?
Messages postés
109
Date d'inscription
mercredi 16 juillet 2008
Statut
Membre
Dernière intervention
4 janvier 2011
1
Est ce que quelqu'un à d'autre idées à me suggérer svp?
Messages postés
21331
Date d'inscription
jeudi 4 novembre 2004
Statut
Modérateur, Contributeur sécurité
Dernière intervention
30 octobre 2019
3 560
Salut,

voici un exemple, pour mieux comprendre
lami20j@debian:~/trash$ cat tableau.pl
#!/usr/bin/perl
#
my @vide = ("a","b","","d");

print "taille = ", scalar @vide,"\n";

my @non_vide1 = grep { /.+/ } @vide; # 1
my @non_vide2 = grep { $_ ne "" } @vide; # 2
for(@vide){push @non_vide3,$_ unless $_ eq "";} #3


print "taille = ", scalar @non_vide1,"\n";
print "taille = ", scalar @non_vide2,"\n";
print "taille = ", scalar @non_vide3,"\n";

print "-" x 20,"\n";
@vide=();
print "taille = ", scalar @vide,"\n";
print "taille = ", scalar @non_vide1,"\n";
print "taille = ", scalar @non_vide2,"\n";
print "taille = ", scalar @non_vide3,"\n";
__END__
lami20j@debian:~/trash$ perl tableau.pl
taille = 4
taille = 3
taille = 3
taille = 3
--------------------
taille = 0
taille = 3
taille = 3
taille = 3
Messages postés
109
Date d'inscription
mercredi 16 juillet 2008
Statut
Membre
Dernière intervention
4 janvier 2011
1
Salut,

J'ai essayé ton code, je l'ai adapté avec le mien mais j'ai toujours le même problème :

open(DESC ,$file ) or die "ERREUR ! \n"; while (<DESC> ) {
chomp($_);
push @tableauFichier , $_
}
close(DESC) ;

for ( 0 .. $#tableauFichier) {
$IdxLigneDuFichier = $_ ;
$tableauFichier[$IdxLigneDuFichier] =~ s/\s+//g;
$tableauFichier[$IdxLigneDuFichier] =~ s/\n//g;
$tableauFichier[$IdxLigneDuFichier] =~ s/('.*?')/\n$1\n/g;
my @tableauCaractere = split (/\n/ , $tableauFichier[$IdxLigneDuFichier]) ;
for ( 0 .. $#tableauCaractere ) {
$IdxCaractereDeLaLigne = $_ ;
print "$tableauCaractere[$IdxCaractereDeLaLigne\n";
}
}

Le fichier est de la forme :
my %toto => ( 'AAAAAA' =>{ 'uuu' => [ 'toto','tata', 'mouloud' ] } );
Je souhaite recuperer chaque mot entre '' dans un tableau.

Merci.
Messages postés
109
Date d'inscription
mercredi 16 juillet 2008
Statut
Membre
Dernière intervention
4 janvier 2011
1
Pour etre plus précise je cherche à placer chaque caractère dans le tableau car je dois vérifier la syntaxe du fichier. (exemple : après my%toto je dois trouver => sinon erreur,
après '[A-Z]+' je dois trouver , sinon erreur ... ).

Une idée?
Plop,

Dans ton code :
$tableauFichier[$IdxLigneDuFichier] =~ s/\s+//g;
$tableauFichier[$IdxLigneDuFichier] =~ s/\n//g;

La deuxième ligne est inutile, les \n sont compris dans les caractères représentés par \s.
De plus le + après le \s n'est pas foncièrement utile non plus, vu qu'avec l'option g tu les supprimeras tous de toute manière.
Tu peux te contenter de ça :
$tableauFichier[$IdxLigneDuFichier] =~ s/\s//g;

Sinon pour la suppression des cases vides, la solution de lamij est bonne, adaptée a ton code ca donnerait un truc comme ca, après le split :

@tableauCaractere = grep {/.+/} @tableauCaractere;

Cdt
Messages postés
109
Date d'inscription
mercredi 16 juillet 2008
Statut
Membre
Dernière intervention
4 janvier 2011
1
Merci dsgdfhdsgd et lami20j, j'ai fais les modifications. Ca fonctionne.