Man*_*our 7 python regex perl variable-assignment substitution
我很头疼地寻找这个:你如何在表达式中使用s ///而不是赋值.为了澄清我的意思,我在下面的上下文中使用时,我正在寻找一个perl等效的python的re.sub(...):
newstring = re.sub('ab', 'cd', oldstring)
Run Code Online (Sandbox Code Playgroud)
到目前为止,我知道如何在perl中执行此操作的唯一方法是:
$oldstring =~ s/ab/cd/;
$newstring = $oldstring;
Run Code Online (Sandbox Code Playgroud)
请注意额外的分配.
DVK*_*DVK 11
您可以使用($new = $old) =~ s/whatever/whateverelse/;与您正在寻找的完全相同的功能:
use strict;
my $old = "OLD";
my $new;
($new = $old) =~ s/OLD/NEW/;
print "old=$old, new=$new";
Run Code Online (Sandbox Code Playgroud)
生产:
old=OLD, new=NEW
Run Code Online (Sandbox Code Playgroud)
正是你想要的
如果您正在寻找一个功能,您可以定义自己的功能以避免分配:
use strict;
sub re_sub {
my ($find, $replace, $old) = @_;
my $new = $old;
$new =~ s/$find/$replace/;
return $new;
}
my $old = "ab";
my $new = re_sub('ab', 'cd', $old);
print "new=$new\n";
Run Code Online (Sandbox Code Playgroud)
结果new=cd.
Perl的正则表达式替换总是"就地"发生.因此,您需要将字符串复制到新变量并对新变量进行操作:
(my $newstring = $oldstring) =~ s/ab/cd/;
Run Code Online (Sandbox Code Playgroud)
你似乎对如何=~运作有误解. =~是一个绑定运算符,它将变量与regexp运算符相关联.它没有做任何任务.
regexp运算符默认使用主题变量$_,因此s/foo/bar/;与$_ =~ s/foo/bar/;.没有分配.主题变量已转换.
在对任何其他变量进行操作时,情况类似.通过替换with 的第一个实例进行$var =~ s/foo/bar/;转换.没有分配.$varfoobar
我能给你的最好建议是用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/;
}
Run Code Online (Sandbox Code Playgroud)
或者您可能需要应用一组可变的变换.我定义了一个子例程来循环定义旧/新转换对的数组引用列表.此示例利用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;
}
Run Code Online (Sandbox Code Playgroud)
最后有点乱七八糟地提供修改其第一个参数的转换版本:
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/;
}
}
Run Code Online (Sandbox Code Playgroud)
对于我自己的项目,我可能会根据特定问题的需要使用前两个选项中的一个.