あなたはどのように機能するかについて誤解しているようです=~
。 =~
変数を正規表現演算子に関連付けるバインディング演算子です。割り当ては行いません。
正規表現演算子はすべてデフォルトでトピック変数$_
で機能するためs/foo/bar/;
、と同じ$_ =~ s/foo/bar/;
です。割り当ては発生しません。トピック変数が変換されます。
他の変数を操作する場合も同様です。の最初のインスタンスを。に置き換えることで$var =~ s/foo/bar/;
変換します。割り当ては発生しません。$var
foo
bar
私があなたに与えることができる最善のアドバイスは、PythonでPythonを、PerlでPerlを書くことです。2つの言語が同じであると期待しないでください。
DVKが提案するように、慣れている置換動作を再現するサブルーチンを作成することができます。
または、慣用的なPerlを試すこともできます。1行に複数の変換を適用したいというあなたの表明された要望に基づいて、役立つと思われるいくつかの例を示しました。
ここでは、for
1つのアイテムのループを使用して、$var
ハードコードされた多くの変換をトピック化して適用します。
for( $var ) {
s/foo/bar/;
s/fizz/buzz/;
s/whop/bop-a-loo-bop/;
s/parkay/butter/;
s/cow/burger/;
}
または、変換の可変グループを適用する必要があるかもしれません。古い/新しい変換ペアを定義する配列参照のリストをループするサブルーチンを定義します。この例では、Perlのリスト指向の引数処理を利用して、任意の数の変換を処理します。
my $foo = transform(
'abcd' =>
[ 'a', 'b' ],
[ 'bb', 'c' ],
[ 'cc', 'd' ],
[ 'dd', 'DONE' ],
);
sub transform {
my $var = shift;
for (@_ ) {
my ($old, $new) = @$_;
$var =~ s/$old/$new/;
}
return $var;
}
最後に、最初の引数を変更するバージョンの変換を提供するために少し混乱します。
my $foo = 'abcd';
transform_in_place(
$foo =>
[ 'a', 'b' ],
[ 'bb', 'c' ],
[ 'cc', 'd' ],
[ 'dd', 'DONE' ],
);
print "$foo\n";
sub transform_in_place {
for my $i (1..$#_ ) {
my ($old, $new) = @{$_[$i]};
$_[0] =~ s/$old/$new/;
}
}
私自身のプロジェクトでは、特定の問題のニーズに応じて、おそらく最初の2つのオプションのいずれかを使用します。