У вас, похоже, неправильное представление о том, как работает =~
. =~
- это оператор связывания, который связывает переменную с оператором регулярного выражения. Он не выполняет никаких заданий.
Все операторы регулярного выражения по умолчанию работают с переменной темы $_
, поэтому s/foo/bar/;
совпадает с $_ =~ s/foo/bar/;
. Назначение не происходит. Переменная темы преобразуется.
Случай аналогичен при работе с любой другой переменной. $var =~ s/foo/bar/;
преобразует $var
, заменяя первый экземпляр foo
на bar
. Присвоение не происходит.
Лучший совет, который я могу вам дать, это написать Python на Python и Perl на Perl. Не ожидайте, что два языка будут одинаковыми.
Вы можете сделать так, как предлагает DVK, и написать подпрограмму, которая будет воспроизводить привычное для вас поведение замещения.
Или вы можете попробовать какой-нибудь идиоматический Perl. Исходя из вашего желания применить несколько преобразований в одной строке, я привел пару примеров, которые могут оказаться полезными.
Здесь я использую цикл for
над одним элементом для актуализации $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/;
}
}
Для моего собственного проекта я бы, вероятно, использовал один из первых двух вариантов в зависимости от потребностей конкретной проблемы.