我想做这样的事情
$string ='4791';
$string =~ tr/4791/(ma)(laya)(lam)(_baasha)/;
应该给我
$string='malayalam_baasha';
即用其他n个字符替换每个字符。每个角色的n可能不同。
这个翻译是否有单行解决方案?
答案 0 :(得分:5)
假设您总是想要用特定字符串替换单个字符...
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"
只需为要替换的每个字符在%Replacement中输入一个条目。
重新阅读你的问题,不,这不是一行,但如果你愿意,可以这样写(虽然杂乱)。然而,将它限制在一条线上实际上取决于你想拥有多少不同的交换。在某一点之后,它会变得丑陋。
答案 1 :(得分:3)
正确的答案是布莱恩·杰拉德(Brian Gerard),但它可以在一个相当短且几乎可读的线上完成:
$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;
答案 2 :(得分:1)
此
($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);
应该工作!但我不会用它!!