2024-09-28 22:20:25 发布
网友
找这个我头疼: 如何在表达式中使用s///而不是赋值。为了澄清我的意思,我在寻找一个perl等价的python的re.sub公司(…)在以下上下文中使用时:
newstring = re.sub('ab', 'cd', oldstring)
到目前为止,我知道如何在perl中执行此操作的唯一方法是:
注意额外的任务。在
您可以使用($new = $old) =~ s/whatever/whateverelse/;获得与您正在寻找的功能完全相同的功能:
($new = $old) =~ s/whatever/whateverelse/;
use strict; my $old = "OLD"; my $new; ($new = $old) =~ s/OLD/NEW/; print "old=$old, new=$new";
产生:
正是你想要的
如果要查找函数,可以定义自己的函数以避免赋值:
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";
结果是new=cd。在
new=cd
Perl的正则表达式替换总是“就地”发生。因此,您需要将字符串复制到新变量并对新变量进行操作:
(my $newstring = $oldstring) =~ s/ab/cd/;
您似乎对=~的工作方式有误解。=~是一个绑定运算符,它将变量与regexp运算符相关联。它不做任何赋值。在
=~
默认情况下,regexp操作符都与主题变量$_一起工作,因此s/foo/bar/;与{}相同。不进行赋值。主题变量被转换。在
$_
s/foo/bar/;
当操作任何其他变量时,情况类似。$var =~ s/foo/bar/;通过将foo的第一个实例替换为bar来转换$var。不进行赋值。在
$var =~ s/foo/bar/;
foo
bar
$var
我能给你的最好建议是用Python编写Python,用Perl编写Perl。别指望这两种语言是一样的。在
你可以像DVK建议的那样,编写一个子程序来重现你习惯的替换行为。在
或者您可以尝试一些惯用的Perl。基于您表达的在一行中应用多个转换的愿望,我提供了几个您可能会觉得有用的示例。在
在这里,我在一个项目上使用for循环来主题化$var并应用许多硬编码转换:
for
for( $var ) { s/foo/bar/; s/fizz/buzz/; s/whop/bop-a-loo-bop/; s/parkay/butter/; s/cow/burger/; }
或者可能需要应用一组可变的变换。我定义了一个子例程来遍历定义旧/新转换对的数组引用列表。这个例子利用Perl面向列表的参数处理来处理任意数量的转换。在
最后提供了一个修改其第一个参数的transform版本:
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/; } }
对于我自己的项目,我可能会根据特定问题的需要使用前两个选项中的一个。在
您可以使用
($new = $old) =~ s/whatever/whateverelse/;
获得与您正在寻找的功能完全相同的功能:产生:
^{pr2}$正是你想要的
如果要查找函数,可以定义自己的函数以避免赋值:
结果是
new=cd
。在Perl的正则表达式替换总是“就地”发生。因此,您需要将字符串复制到新变量并对新变量进行操作:
您似乎对
=~
的工作方式有误解。=~
是一个绑定运算符,它将变量与regexp运算符相关联。它不做任何赋值。在默认情况下,regexp操作符都与主题变量}相同。不进行赋值。主题变量被转换。在
$_
一起工作,因此s/foo/bar/;
与{当操作任何其他变量时,情况类似。
$var =~ s/foo/bar/;
通过将foo
的第一个实例替换为bar
来转换$var
。不进行赋值。在我能给你的最好建议是用Python编写Python,用Perl编写Perl。别指望这两种语言是一样的。在
你可以像DVK建议的那样,编写一个子程序来重现你习惯的替换行为。在
或者您可以尝试一些惯用的Perl。基于您表达的在一行中应用多个转换的愿望,我提供了几个您可能会觉得有用的示例。在
在这里,我在一个项目上使用
for
循环来主题化$var
并应用许多硬编码转换:或者可能需要应用一组可变的变换。我定义了一个子例程来遍历定义旧/新转换对的数组引用列表。这个例子利用Perl面向列表的参数处理来处理任意数量的转换。在
^{pr2}$最后提供了一个修改其第一个参数的transform版本:
对于我自己的项目,我可能会根据特定问题的需要使用前两个选项中的一个。在
相关问题 更多 >
编程相关推荐