1

我想做这样的事情

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

应该给我

$string='malayalam_baasha';

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

这个翻译有一个单一的解决方案吗?

4

3 回答 3

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 中输入一个条目。

重新阅读您的问题,不,这不是一行,尽管如果您愿意,可以这样写(尽管很混乱)。不过,将其限制在一条线上实际上取决于您想要进行多少次不同的交流。过了一定的时间,它会变得丑陋。

于 2011-06-16T17:39:23.093 回答
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;
于 2011-06-16T20:18:51.517 回答
1

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

或者

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

应该管用!但是我不会用!!

于 2011-06-16T18:12:25.617 回答