IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage Perl Discussion :

Remplacement par Analyse


Sujet :

Langage Perl

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Avril 2006
    Messages
    101
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 101
    Par défaut Remplacement par Analyse
    Bonjour,
    je souhaite réaliser un script qui me remplace des lettres par d'autres après une analyse. Je m'explique.

    Dans la langue francais il y a des lettres plus utilisé que d'autres. Voici un array que j'ai réalise :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    @fr = ("E","A","S","I","N","T","R","L","U","O","D","C","P","M","V","G","F","B","Q","H","X","J","Y","Z","K","W");
    La lettre E est la plus utilisé, ensuite a, puis s puis I...

    Dna mon script, l'utilisateur donne un texte crypté de manière mono alphabétique. Je réalise une analyse fréquentielle dessus et je classe les résultats dans un array aussi.
    Par exemple la lettres O a été repéré 4 fois, E 3 fois A 1 fois => @g = ("O","E","A");

    Je veux maintenant que la lettre O (qui est la plus fréquente) soit remplacé par la lettre E qui est la plus fréquente en fr, que la lettre E soit remplacé par A la deuxième plus fréquente en Fr et ainsi de suite.

    Ce principe est les fréquences d'Al Kindi.

    J'ai essayé de réaliser une fonction :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    sub replacement {
    @fr = ("E","A","S","I","N","T","R","L","U","O","D","C","P","M","V","G","F","B","Q","H","X","J","Y","Z","K","W");
    @tableau = ("A".."Z"); 
    $texte = $_[0];
    $len = length $texte; 
    foreach (@tableau){ 
    $oc = ($texte =~ s/($_)/$1/g); 
    if ($oc != 0){
    $resulch{$_} = $oc;
    }
    } 
    @g = sort { $resulch{$b} <=> $resulch{$a} } keys %resulch;
    foreach $varg (@g){
    foreach $varfr (@fr){
    $texte =~ s/$varg/$varfr/g;
    }
    }
    print $texte;
    }

    Mais évidemment cela ne marche pas a cette endroit :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    foreach $varg (@g){
    foreach $varfr (@fr){
    $texte =~ s/$varg/$varfr/g;
    }
    }
    Je ne vois pas comment m'en sortir. Pourriez vous m'aider ?
    Merci d'avance pour votre aide

  2. #2
    Membre Expert
    Avatar de 2Eurocents
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    2 177
    Détails du profil
    Informations personnelles :
    Âge : 55
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 2 177
    Par défaut
    Si j'ai bien compris le principe, une solution serait de procéder comme suit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    my @fr = ("E","A","S","I","N","T","R","L","U","O","D","C","P","M","V","G","F","B","Q","H","X","J","Y","Z","K","W");
     
    # Le texte "crypté"
    my $texte="OOEAEOEO";
     
    # Le tableau résultant de l'analyse des fréquences des lettres dans $texte
    my @g = ("O","E","A");
     
    # On "mache" ce tableau pour avoir un moyen "facile" de retrouver le rang de la lettre dedans :
    # On crée un hash indexé par la lettre, et dont la valeur est l'indice de la lettre dans @g
    my %tri = map { ($g[$_],$_) } (0..$#g);
     
    # Maintenant, la vraie magie : on fait la substitution ...
    my $texte_substitue = join("", map { $fr[$tri{$_}] } split (//, $texte));
     
    print $texte_substitue;
    Voila ... la partie magique utilise le hash %tri que l'on a créé juste avant.

    En gros, on sépare le texte en un tas de lettres individuelles que map va parcourir.
    Map fait ce parcours et, pour chaque lettre rencontrée, retourne la lettre de @fr indicée par le classement de la lettre dans @g.
    Toutes ces lettres retournées sont rassemblées par join et le tour est joué.

    Il existe d'autres façons de le faire.

Discussions similaires

  1. Accents remplacés par des ? durant l'écriture
    Par mona dans le forum Entrée/Sortie
    Réponses: 4
    Dernier message: 03/01/2006, 14h13
  2. Trouver ' et remplacer par \' dans une chaîne
    Par micatmidog dans le forum Général Python
    Réponses: 9
    Dernier message: 23/12/2005, 16h09
  3. impossible de remplacer "-" par "_"
    Par fabrice1596 dans le forum Langage
    Réponses: 2
    Dernier message: 04/11/2005, 11h31
  4. [XSLT] Remplacer par des caractères spéciaux
    Par OXyGN dans le forum XSL/XSLT/XPATH
    Réponses: 3
    Dernier message: 29/07/2005, 17h30
  5. [JSTL] Mes variables ne sont pas remplacées par leur valeur
    Par thomine dans le forum Taglibs
    Réponses: 9
    Dernier message: 18/03/2005, 10h00

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo