我想做这样的事情
$string ='4791';
$string =~ tr/4791/(ma)(laya)(lam)(_baasha)/;
应该会给我
$string='malayalam_baasha';
即用n个其他字符替换每个字符。对于每个字符,n可能不同。
这个翻译有没有一行的解决方案?
发布于 2011-06-16 17:39:23
假设您总是想用特定的字符串替换单个字符...
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-16 20:18:52
正确的答案是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-16 18:12:26
这
($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);
应该行得通!但我不会用它!
https://stackoverflow.com/questions/6375944
复制