Domanda
Voglio fare qualcosa del genere
$string ='4791';
$string =~ tr/4791/(ma)(laya)(lam)(_baasha)/;
dovrebbe darmi
$string='malayalam_baasha';
cioè sostituire ogni personaggio con altri caratteri. n può essere diverso per ogni personaggio.
Esiste una soluzione a una riga per questa traduzione?
Soluzione
Supponendo che tu voglia sempre sostituire un singolo carattere con una stringa specifica ...
my %Replacement = (
'0' => 'abc',
'1' => 'def',
'2' => 'ghi',
'3' => 'jkl',
# ... whatever others you like ...
);
my $String = '0123';
print "$String\n"; # Prints "0123"
$String =~ s{(.)}
{exists($Replacement{$1}) ? $Replacement{$1} : $1}egx;
print "$String\n"; # Prints "abcdefghijkl"
Basta fare una voce in %Sostituzione per ogni personaggio che si desidera scambiare.
Relegando la tua domanda, no, questo non è su una riga, anche se può essere scritto come tale (anche se in modo disordinato) se lo desideri. Vincolarlo a una singola riga dipenderà davvero da quanti scambi diversi vuoi avere, però. Dopo un certo punto, diventerà brutto.
Altri suggerimenti
La risposta giusta è di Brian Gerard, ma può essere fatto in una linea abbastanza breve e quasi leggibile:
$string =~ s/(.)/{1 => "_baasha", 4 => "ma", 7 => "laya", 9 => "lam"}->{$1}/ge;
o una breve linea illeggibile:
$string =~ s/(.)/{4,ma=>7,laya=>9,lam=>1,"_baasha"}->{$1}/ge;
o anche più corto, ma un po 'più leggibile:
$string =~ s/(.)/qw(a _baasha a a ma a a laya a lam)[$1]/ge;
o il più corto che potrei ottenerlo (questo non funzionerà strict
acceso):
$string =~ s/(.)/(a,_baasha,a,a,ma,a,a,laya,a,lam)[$1]/ge;
Questo
($i=0) || (@tr = qw |abc def ghi jkl| ) && (@string = map { $tr[$i++] } split //,'0123') && ($string =join '',@string);
O
( %tr = ( 0 => 'abc' , 1 => 'def' , 2 => 'ghi' , 3 => 'jkl' ) ) && (@string = map { $tr{$_} } split //,'0123') && ($string =join '',@string);
dovrebbe funzionare! Ma non lo userei !!