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

[Résolu/Fermé]
Signaler
-
 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

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,
#!/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
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é.
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,

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
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
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
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 !!
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
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
Salut salut !!

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

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