質問

このようなことをしたいです

$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"

交換したいキャラクターごとに%交換するだけのエントリを作成してください。

あなたの質問を読み直すと、いいえ、これは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); 

動作するはずです!しかし、私はそれを使用しません!!

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top