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?

È stato utile?

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

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top