use strict; while(){ chomp; /(\d+)\s+([_a-z.]+)/ or last; my $plaintext = decipher($1, $2); print "$plaintext\n"; } sub decipher { $,=0;($;,$_)=@_;@;{@;{0..27}=('_','a'..'z','.')}=0..27;$;[$;*$,++%@_]=$;{($;{$_}+$,)%28}for@_=/./g;join'',@; } __DATA__ 5 cs. 101 thqqxw.lui.qswer 3 b_ylxmhzjsys.virpbkr 0