Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

principe de moteur de recherche

5 réponses
Avatar
Paul
Bonjour,

Je ne sais pas trop comment rechercher une librairie qui me permette
la chose suivante :
- je fourni un texte ($input)
- je fourni une table $hash de ce style : {key1 =3D>Array('val1', 'val1
bis'), key2 =3D>Array('val2', 'val2 bis')}

Et ensuite la librairie en question va aller rechercher le nombre
d'occurences de key1, et de key2 contenues dans $input. S=E2chant que le
nombre d'occurences de key1 est la somme des occurences de chaque
=E9l=E9ments de $hash{'key1'}.

Un exemple pour mieux comprendre :
$hash =3D {key1 =3D>Array('val1', 'val bis'), key2 =3D>Array('machin',
'truc')};
$input =3D "val1 est un super test Val bis mais aussi un test ridicule
sur vAL1... Ensuite, on fera un test pour TrUc car c'est assez
complexe comme maChin.";

Je souhaite avoir ce retour :
- Nombre d'occurences de 'key1' =3D 3
- Nombre d'occurences de 'key2' =3D 2

Vous connaissez une librairie qui me permette ce que je veux ?

5 réponses

Avatar
Jogo
Sur fr.comp.lang.perl, Paul disait :

Vous connaissez une librairie qui me permette ce que je veux ?



Non.

Par contre, expliqué comme ça, ça ne me paraît pas trop compliqué :

my %frequence_of;
for my $key (keys %hash) {
for my $val (@{ $hash{$key} }) {
if (my $nb = $input =~ s/Q$val/$&/ig) {
$frequence_of{$key} += $nb;
}
}
}
dump(%frequence_of);

Mais je trouve que ton %hash est "à l'envers". Je préfèrerais le
transformer comme ça :

my %usefull_hash;
for my $key (keys %hash) {
for my $val (@{ $hash{$key} }) {
push @{ $usefull_hash{$val} }, $key;
}
}

Ensuite, tu peux l'utiliser ainsi :

for my $regex (keys %usefull_hash) {
if (my $nb = $input =~ s/Q$regex/$&/ig) {
for my $key (@{ $usefull_hash{$regex} }) {
$frequence_of{$key} += $nb;
}
}
}

Pour une seule chaine à tester, c'est un peu plus long. Mais si tu
teste plein de chaines, ça doit être rentable de retourner le hash.

--
Ce qui rend les voyages à peu près inutiles,
c'est que l'on se déplace toujours avec soi.
- Henri Calet - L'Italie à la paresseuse -
Avatar
Paul
> my $nb = $input =~ s/Q$regex/$&/ig


Que sgnifie le Q ?
Avatar
Paul
On 12 août, 13:15, Paul wrote:
> my $nb = $input =~ s/Q$regex/$&/ig

Que sgnifie le Q ?



arf... :
http://perldoc.perl.org/perlfaq6.html
"The use of Q causes the <.> in the regex to be treated as a regular
character, so that P. matches a P followed by a dot."
Avatar
Paul Gaborit
À (at) Wed, 12 Aug 2009 04:19:36 -0700 (PDT),
Paul écrivait (wrote):
On 12 août, 13:15, Paul wrote:
> my $nb = $input =~ s/Q$regex/$&/ig

Que sgnifie le Q ?



arf... :
http://perldoc.perl.org/perlfaq6.html
"The use of Q causes the <.> in the regex to be treated as a regular
character, so that P. matches a P followed by a dot."



C'est un peu plus que ça : Q désactive les meta-caractères de motif
jusqu'au prochain E. Dans les meta-caractères, on trouve bien sûr '.'
mais aussi '+', '*', '?', '(', etc.


--
Paul Gaborit - <http://perso.mines-albi.fr/~gaborit/>
Perl en français - <http://perl.mines-albi.fr/>
Avatar
Nicolas George
Paul Gaborit wrote in message :
> my $nb = $input =~ s/Q$regex/$&/ig




C'est un peu plus que ça : Q désactive les meta-caractères de motif
jusqu'au prochain E.



Précisons que la recherche du E correspondant est faite avant
l'interpolation, ce qui fait que si $regex contient la chaîne E, ce sera
remplacé par E de manière à la chercher littéralement.

C'est, évidemment, le seul comportement raisonnable, mais c'est toujours
mieux d'être rassuré sur le fait que c'est bien le comportement adopté.