Perl翻译

时间:2011-06-16 17:18:31

标签: perl transactions tr

我想做这样的事情

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

应该给我

$string='malayalam_baasha';

即用其他n个字符替换每个字符。每个角色的n可能不同。

这个翻译是否有单行解决方案?

3 个答案:

答案 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); 

应该工作!但我不会用它!!