[PERL]Expression régulière : décaler D lettre
Résolu/Fermé
A voir également:
- [PERL]Expression régulière : décaler D lettre
- Expression de recherche - Guide
- Denon perl pro test - Accueil - Audio
- T'as du ping expression - Forum Réseau
- Quel fichier contient l’expression trouverpix ? - Forum Programmation
- Expression encoder - Télécharger - Divers Utilitaires
7 réponses
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 569
26 nov. 2006 à 18:50
26 nov. 2006 à 18:50
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 :
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é.
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é.
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 569
27 nov. 2006 à 01:10
27 nov. 2006 à 01:10
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.
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
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 569
27 nov. 2006 à 03:29
27 nov. 2006 à 03:29
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
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
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 !!
Si ta le temps, peux-tu m'expliquer grosso modo ton code car ça m'intéresse beaucoup.
En tout cas merci encore !!
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 569
27 nov. 2006 à 19:35
27 nov. 2006 à 19:35
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
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