Перевод Perl - PullRequest
       12

Перевод Perl

1 голос
/ 16 июня 2011

Я хочу сделать что-то вроде этого

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

должно дать мне

$string='malayalam_baasha';

т.е. заменить каждый символ на n других символов.n может отличаться для каждого символа.

Существует ли однострочное решение для этого перевода?

Ответы [ 3 ]

5 голосов
/ 16 июня 2011

Предполагая, что вы всегда хотите заменить один символ определенной строкой ...

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"

Просто введите значение в% замены для каждого символа, который вы хотите поменять.

Перечитывая ваш вопрос, нет, это не в одной строке, хотя это может быть написано так (хотя и беспорядочно), если хотите.Ограничение одной строкой действительно будет зависеть от того, сколько разных обменов вы хотите иметь.После определенного момента это станет уродливым.

3 голосов
/ 17 июня 2011

Правильный ответ Брайана Джерарда, но это можно сделать в одной довольно короткой и почти читаемой строке:

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

или одна короткая нечитаемая строка:

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

или даже короче, но немного более читабельно:

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

или самое короткое, что я мог получить (этот не будет работать при включенном strict):

$string =~ s/(.)/(a,_baasha,a,a,ma,a,a,laya,a,lam)[$1]/ge;
1 голос
/ 16 июня 2011

Это

($i=0) || (@tr = qw |abc def ghi jkl| ) && (@string = map { $tr[$i++] } split //,'0123') && ($string =join '',@string);

OR

( %tr = ( 0 => 'abc' , 1 => 'def' , 2 => 'ghi' , 3 => 'jkl' ) ) && (@string = map { $tr{$_} } split //,'0123') && ($string =join '',@string); 

должно работать! Но я бы этим не воспользовался !!

...