OVH Cloud OVH Cloud

Probleme de filtre

6 réponses
Avatar
Truty
Bonjour,

Pouvez-vous m'aider ? je cherche à selectionner les mots d'un fichier
texte qui répondent à deux conditions :
doit contenir les caractères de cette variable : $carac_bon;
mais pas les caractères de cette variable : $carac_mauvais;

mon fichier texte "liste.txt"

exemple avec $carac_bon = 'eo'; et $carac_mauvais = 'hydngp';
mots selectionné : close, mouve, ... parce que 'o' et 'e' est inclue
dasn ces mots ET 'h', 'y', 'd', 'n', 'g', 'p' ne le sont pas.

contenu de liste.txt :
doing
close
sunny
drugs
mouve
...


le bout de code qui pose problème :
open (FILE,"liste.txt");
while ($ligne = <FILE>) {
chomp($ligne);
if (($ligne =~ \[$carac_bon]\) && ($ligne !~ \[$carac_mauvais]\) ) {
print $ligne." | "; }
}
close FILE;



Je vous remercie d'avance ;)

6 réponses

Avatar
Rue des Prairies
Bonjour,

le bout de code qui pose problème :
open (FILE,"liste.txt");
while ($ligne = <FILE>) {
chomp($ligne);
if (($ligne =~ [$carac_bon]) && ($ligne !~ [$carac_mauvais]) ) {
print $ligne." | "; }
}
close FILE;

Je vous remercie d'avance ;)



Bonjour,

Remplace les par des /

Olivier.

Avatar
Truty
Rue des Prairies a présenté l'énoncé suivant :
Bonjour,

le bout de code qui pose problème :
open (FILE,"liste.txt");
while ($ligne = <FILE>) {
chomp($ligne);
if (($ligne =~ [$carac_bon]) && ($ligne !~ [$carac_mauvais]) ) {
print $ligne." | "; }
}
close FILE;

Je vous remercie d'avance ;)



Bonjour,

Remplace les par des /

Olivier.


Merci,

ok j'ai mi dans l'autre sens mais le probleme c'ets que j'ai les mots
contenant une des lettres de $carac_bon et pas toutes.

As tu une idée ?


Avatar
Benoit Izac
Bonjour,

le 02/09/2006 à 18:40, Truty a écrit dans le message
:

le bout de code qui pose problème :
open (FILE,"liste.txt");
while ($ligne = <FILE>) {
chomp($ligne);
if (($ligne =~ [$carac_bon]) && ($ligne !~
[$carac_mauvais]) ) { print $ligne." | "; }
}
close FILE;

Je vous remercie d'avance ;)



Bonjour,

Remplace les par des /

Olivier.


Merci,

ok j'ai mi dans l'autre sens mais le probleme c'ets que j'ai les mots
contenant une des lettres de $carac_bon et pas toutes.


Il y a peut-être plus simple mais cette solution fonctionne :

#!/usr/bin/perl
use warnings;
use strict;

my $carac_bon = 'eo';
my $carac_mauvais = 'hydngp';

my $l = length($carac_bon);

while (my $ligne = <DATA>) {
chomp $ligne;
next if ($ligne =~ m/[$carac_mauvais]/);
my $i = 0;
foreach my $c (split //, $carac_bon) {
$i++ if ($ligne =~ m/$c/);
}
print "$ligne | " if ($i == $l);
}
print "n";

__DATA__
doing
close
sunny
drugs
mouve
e
oe
o

--
Benoit Izac



Avatar
Denis Dordoigne
Bonjour,


ok j'ai mi dans l'autre sens mais le probleme c'ets que j'ai les mots
contenant une des lettres de $carac_bon et pas toutes.
Normal, c'est exactement ce que signifie [$carac_bon]. Ce que tu veux, ce

sont des mots contenant toutes les lettres de $carac_bon ? Tu commences à
décrire un langage non régulier, ça va être difficile de le traduire en
regexp.


As-tu des contraintes de performance ?

--
Denis

Avatar
Rue des Prairies
ok j'ai mi dans l'autre sens mais le probleme c'ets que j'ai les mots
contenant une des lettres de $carac_bon et pas toutes.

As tu une idée ?


Dans la même veine que la solution de Benoît (à toi de faire un benchmark) :

#!/usr/bin/perl
use strict;
use warnings;
my $carac_bon = 'eo';
my @bon = split(//,$carac_bon);
my $carac_mauvais = 'hydngp';
LOOP1:
while (my $ligne = <DATA>) {
chomp($ligne);
next if($ligne =~ /[$carac_mauvais]/);
foreach(@bon){
next LOOP1 if(index($ligne,$_) == -1);
}
print $ligne," | ";
}
__DATA__
doing
close
sunny
drugs
mouve
hydrogene
eo
bee
go on

Avatar
Klaus
Truty wrote:
Bonjour,

Pouvez-vous m'aider ? je cherche à selectionner les mots d'un fichier
texte qui répondent à deux conditions :
doit contenir les caractères de cette variable : $carac_bon;
mais pas les caractères de cette variable : $carac_mauvais;

mon fichier texte "liste.txt"

exemple avec $carac_bon = 'eo'; et $carac_mauvais = 'hydngp';
mots selectionné : close, mouve, ... parce que 'o' et 'e' est inclue
dasn ces mots ET 'h', 'y', 'd', 'n', 'g', 'p' ne le sont pas.

contenu de liste.txt :
doing
close
sunny
drugs
mouve
...


le bout de code qui pose problème :
open (FILE,"liste.txt");
while ($ligne = <FILE>) {
chomp($ligne);
if (($ligne =~ [$carac_bon]) && ($ligne !~ [$carac_mauvais]) ) {
print $ligne." | "; }
}
close FILE;


voici le programme:
========================= ===========
use strict;
use warnings;

my $carac_bon = 'eo';
my $carac_mauvais = 'hydngp';

open my $FILE, '<', 'liste.txt' or die "Erreur <liste.txt ($!)";
while (my $ligne = <$FILE>) {
chomp($ligne);
if ($ligne =~ /[Q$carac_bonE]/
and $ligne !~ /[Q$carac_mauvaisE]/) {
print $ligne, ' | ';
}
}
close $FILE;
========================= ===========

avec le contenu dans 'liste.txt':
========================= ===========
doing
close
sunny
drugs
mouve
========================= ===========

voici le résultat:
========================= ===========
close | mouve |
========================= ===========