[PERL]Expression régulière : décaler D lettre

Résolu
Johann -  
 Keneda95 -
Bonsoir tout le monde !

Voilà, je dois faire un script de pseudo crypto qui décale les lettres selon un chiffre en paramètre, supposons que ce chiffre soit 3 :
'a' donnerai 'd'
'b' donnerai 'e'
...

Et là je me galère comme un cochon pour le faire, j'ai fait un truc (complètement faux) qui donne :

$chaine =~ s /a-z/a+$nombre-z+$nombre/


Grosso modo je sais pas du tout comment faire, j'ai 6 pages de docs sur les expressions régulières mais en vain...

Si quelqu'un voit comme faire je suis tout ouïe...

@ller, bonne soirée !! Et bonne semaine !!

7 réponses

  1. lami20j Messages postés 21506 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 571
     
    Salut,
    #!/usr/bin/perl
    use strict;use warnings;
    
    my $ch = join "","a".."z";
    (my $ch_d = $ch) =~s/(.)/chr(ord($1)+3)/eg;
    print "$ch\n$ch_d\n";
    __END__
    

    Le résultat


    lami20j@debian:~$ perl decaler.pl
    abcdefghijklmnopqrstuvwxyz
    defghijklmnopqrstuvwxyz{|} 
    lami20j
    0
  2. Johann
     
    Salut Lami20j et merci encore pour ton aide (tu m'as déjà bien aidé la semaine dernière ) !!

    En faite, le script doit crypter un fichier pour cela j'ai fait le code suivant :
    #!/usr/bin/perl
    
    use warnings;
    use strict;
    
    open(IN,$ARGV[0]) || die "Problème d'ouverture du fichier";
    
    while( my $line = <IN> ){
     chomp($line);
     foreach (split //,$line){
    	open(OUT, ">> ".$ARGV[0].".crypted") or die "Ouverture impossible";
    	printf OUT (rot13($_));
     }
    }
    
    sub rot13{
    my $chaine = shift;
    $chaine =~ y/a-zA-Z/n-za-mN-ZA-M/;
    
    return $chaine;
    }
    
    


    Ce script décale de 13 lettres les autres lettres mais là ça devient plus corsé car l'on ne connait le chiffre de décalage.

    Ton code marche super, mais il ne décale pas les dernières lettres, par exemple si le chiffre est 3, le 'y' devient 'b' et le 'z' devient 'c', mais c'est ma faute, j'ai mal précisé dans mon premier post. Désolé.
    0
  3. lami20j Messages postés 21506 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 571
     
    Re,

    voilà quelque chose qui peut te convenir, enfin je suppose.
    Le décalage est en dur 13. En revanche tu peux créer une variable et demander de saisir le décalage.
    #!/usr/bin/perl
    use strict;use warnings;
    
    sub d_Min {
    my ($ch,$d) = @_;
    
      if ( ord($ch) < 91 and ord($ch) > (90 - $d) ){
        return chr(ord($ch) -26 + $d);
      }elsif ( (ord($ch) < 65) or (ord($ch) > 90 and ord($ch) < 97)
                               or (ord($ch) > 122)){
        return chr(ord($ch));
      }else{
        return chr(ord($ch)+$d);
      }
    }
    
    sub d_Maj {
    my ($ch,$d) = @_;
    
      if ( ord($ch) < 123 and ord($ch) > (122 - $d) ) {
        return chr(ord($ch) -26 + $d);
      }elsif ( (ord($ch) < 65) or (ord($ch) > 90 and ord($ch) < 97)
                               or (ord($ch) > 122)){
        return chr(ord($ch));
      }else{
        return chr(ord($ch)+$d);
      }
    }
    
    while(<DATA>) {
      s/(.)/(ord($1)< 91)?d_Min($1,13):d_Maj($1,13)/eg;
      print;
    }
    __END__
    Ici je commence le cryptage,
    Le même code appliqué sur le texte crypté va le decrypté
    
    abcdefghijklmnopqrstuvwxyz
    ABCDEFGHIJKLMNOPQRSTUVWXYZ
    
    Bonsoir tout le monde !
    
    Voilà, je dois faire un script de pseudo crypto qui décale les lettres 
    selon un chiffre en paramètre, supposons que ce chiffre soit 3 :
    'a' donnerai 'd'
    'b' donnerai 'e' 
    
    
    Vpv wr pbzzrapr yr pelcgntr,
    Yr zêzr pbqr nccyvdhé fhe yr grkgr pelcgé in yr qrpelcgé
    
    nopqrstuvwxyzabcdefghijklm
    NOPQRSTUVWXYZABCDEFGHIJKLM
    
    Obafbve gbhg yr zbaqr !
    
    Ibvyà, wr qbvf snver ha fpevcg qr cfrhqb pelcgb dhv qépnyr yrf yrggerf 
    fryba ha puvsser ra cnenzèger, fhccbfbaf dhr pr puvsser fbvg 3 :
    'n' qbaarenv 'q'
    'o' qbaarenv 'r' 

    Le résultat


    Vpv wr pbzzrapr yr pelcgntr,
    Yr zêzr pbqr nccyvdhé fhe yr grkgr pelcgé in yr qrpelcgé
    
    nopqrstuvwxyzabcdefghijklm
    NOPQRSTUVWXYZABCDEFGHIJKLM
    
    Obafbve gbhg yr zbaqr !
    
    Ibvyà, wr qbvf snver ha fpevcg qr cfrhqb pelcgb dhv qépnyr yrf yrggerf 
    fryba ha puvsser ra cnenzèger, fhccbfbaf dhr pr puvsser fbvg 3 :
    'n' qbaarenv 'q'
    'o' qbaarenv 'r' 
    
    
    Ici je commence le cryptage,
    Le même code appliqué sur le texte crypté va le decrypté
    
    abcdefghijklmnopqrstuvwxyz
    ABCDEFGHIJKLMNOPQRSTUVWXYZ
    
    Bonsoir tout le monde !
    
    Voilà, je dois faire un script de pseudo crypto qui décale les lettres 
    selon un chiffre en paramètre, supposons que ce chiffre soit 3 :
    'a' donnerai 'd'
    'b' donnerai 'e' 
    lami20j
    0
  4. lami20j Messages postés 21506 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 571
     
    ou
    #!/usr/bin/perl
    use strict;use warnings;
    
    sub d_Min {
    my ($ch,$d) = @_;
    
      if ( ord($ch) > (90 - $d) ){
        return chr(ord($ch) -26 + $d);
      }else{
        return chr(ord($ch)+$d);
      }
    }
    
    sub d_Maj {
    my ($ch,$d) = @_;
    
      if ( ord($ch) > (122 - $d) ) {
        return chr(ord($ch) -26 + $d);
      }else{
        return chr(ord($ch)+$d);
      }
    }
    
    while(<DATA>) {
      s/([a-zA-Z])/(ord($1)< 91)?d_Min($1,13):d_Maj($1,13)/eg;
      print;
    }
    __END__
    lami20j
    0
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. Johann
     
    La vache... comment ça à l'air encore balèse ce que tu as fait. Je testerai chez moi ce soir.

    Si ta le temps, peux-tu m'expliquer grosso modo ton code car ça m'intéresse beaucoup.

    En tout cas merci encore !!
    0
  7. lami20j Messages postés 21506 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 571
     
    Voilà encore une version.
    Cette fois ci j'utilise des listes circulaires
    Le décalage sera demandé.
    Si le décalage est plus grand que 26 on reviens toujours à la m^me chose

    Ex:
    avec 13, 26 +13, etc. j'obtiens le même résultat
    donc j'ai mis une condition pour le décalage
    s'il est plus grand que 26 alors le décalage sera le reste de la division entre décalage et 26

    décalage = 39
    39 divisé par 26 = 1 reste 13
    #!/usr/bin/perl 
    use strict;use warnings;
    
    my (%m,%M);
    my @m_circ ='a'..'z';
    my @M_circ ='A'..'Z';
    
    print "Entrez le décalage : ";
    chomp(my $decalage = <STDIN>);
    
    $decalage > 26?$decalage%=26:1;
    
    for (my $i=1;$i<$decalage+1;$i++){
      unshift( @m_circ, pop (@m_circ) );
      unshift( @M_circ, pop( @M_circ) );
    }
    
    @m{'a'..'z'}=@m_circ;
    @M{'A'..'Z'}=@M_circ;
    
    while(<DATA>){
     print  map { $M{$_} or $m{$_} or $_ } /(.)/g;
     print "\n";
    }
    
    __END__
    Le même code appliqué sur le texte crypté va le decrypter
    
    abcdefghijklmnopqrstuvwxyz
    ABCDEFGHIJKLMNOPQRSTUVWXYZ
    
    Bonsoir tout le monde !
    
    Voilà, je dois faire un script de pseudo crypto qui décale les lettres 
    selon un chiffre en paramètre, supposons que ce chiffre soit 3 :
    'a' donnerai 'd'
    'b' donnerai 'e' 
    lami20j
    0
  8. Johann
     
    Salut salut !!

    Je confirme la réussite total de ton script !! Merci encore, tu m'as encore bien dépanné !!

    Bonne fin de semaine !!
    0
    1. Keneda95
       
      Salut tu n'es pas en 2ESGI???? J'ai le meme prog a faire!!!
      0