私はこのようなことをしたい
$string ='4791';
$string =~ tr/4791/(ma)(laya)(lam)(_baasha)/;
私に与えるべきです
$string='malayalam_baasha';
つまり、各文字を他の n 文字に置き換えます。n は文字ごとに異なる場合があります。
この翻訳には 1 行で解決できますか?
私はこのようなことをしたい
$string ='4791';
$string =~ tr/4791/(ma)(laya)(lam)(_baasha)/;
私に与えるべきです
$string='malayalam_baasha';
つまり、各文字を他の n 文字に置き換えます。n は文字ごとに異なる場合があります。
この翻訳には 1 行で解決できますか?
常に単一の文字を特定の文字列に置き換えたいと仮定すると...
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行ではありませんが、必要に応じて(乱雑ですが)そのように書くことができます. ただし、それを1行に制限することは、実際には、いくつの異なる交換を行いたいかによって異なります. ある時点を過ぎると、醜くなります。
正解はBrianGerardのものですが、かなり短く、ほとんど読みやすい1行で実行できます。
$string =~ s/(.)/{1 => "_baasha", 4 => "ma", 7 => "laya", 9 => "lam"}->{$1}/ge;
または1つの短い判読不能な行:
$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);
動作するはずです!でも使いません!!