Pregunta

Quiero hacer algo como esto

$string ='4791';
$string =~ tr/4791/(ma)(laya)(lam)(_baasha)/;

debería darme

$string='malayalam_baasha';

es decir, reemplace cada personaje con n otros personajes. N puede ser diferente para cada personaje.

¿Hay una solución de una línea para esta traducción?

¿Fue útil?

Solución

Suponiendo que siempre desea reemplazar un solo carácter con una cadena específica ...

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"

Simplemente realice una entrada en %de reemplazo para cada personaje que desee cambiar.

Vuelva a leer su pregunta, no, esto no está en una línea, aunque se puede escribir como tal (aunque desordenadamente) si lo desea. Sin embargo, restringirlo a una sola línea dependerá realmente de cuántos intercambios diferentes desea tener. Después de cierto punto, se pondrá feo.

Otros consejos

La respuesta correcta es la de Brian Gerard, pero se puede hacer en una línea bastante corta y casi legible:

$string =~ s/(.)/{1 => "_baasha", 4 => "ma", 7 => "laya", 9 => "lam"}->{$1}/ge;

o una línea corta ilegible:

$string =~ s/(.)/{4,ma=>7,laya=>9,lam=>1,"_baasha"}->{$1}/ge;

o incluso más corto, pero un poco más legible:

$string =~ s/(.)/qw(a _baasha a a ma a a laya a lam)[$1]/ge;

o lo más corto que podría conseguirlo (este no funcionará con strict encendido):

$string =~ s/(.)/(a,_baasha,a,a,ma,a,a,laya,a,lam)[$1]/ge;

Este

($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); 

¡Deberia trabajar! ¡Pero no lo usaría!

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top