문제

I want to do something like this

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

should give me

$string='malayalam_baasha';

i.e replace each character with n other characters. n may be different for each character.

Is there a one line solution for this translation ?

도움이 되었습니까?

해결책

Assuming you always want to replace a single character with a specific string...

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"

Just make an entry in %Replacement for each character you want to swap out.

Re-reading your question, no, this isn't on one line, though it can be written as such (though messily) if you like. Constraining it to a single line will really kind of depend on how many different exchanges you want to have, though. After a certain point, it's going to get ugly.

다른 팁

The right answer is Brian Gerard's, but it can be done in one fairly short and almost readable line:

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

or one short unreadable line:

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

or even shorter, but a bit more readable:

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

or the shortest I could get it (this one won't work with strict turned on):

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

This

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

should work! But I wouldn't use it!!

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top