我想做这样的事情
$string ='4791';
$string =~ tr/4791/(ma)(laya)(lam)(_baasha)/;
应该给我
$string='malayalam_baasha';
即用 n 个其他字符替换每个字符。每个字符的 n 可能不同。
这个翻译有一个单一的解决方案吗?
我想做这样的事情
$string ='4791';
$string =~ tr/4791/(ma)(laya)(lam)(_baasha)/;
应该给我
$string='malayalam_baasha';
即用 n 个其他字符替换每个字符。每个字符的 n 可能不同。
这个翻译有一个单一的解决方案吗?
假设您总是想用特定字符串替换单个字符...
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 中输入一个条目。
重新阅读您的问题,不,这不是一行,尽管如果您愿意,可以这样写(尽管很混乱)。不过,将其限制在一条线上实际上取决于您想要进行多少次不同的交流。过了一定的时间,它会变得丑陋。
正确的答案是 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;
这
($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);
应该管用!但是我不会用!!