csy*_*prv 3 regex perl replace
我有一个字符串:
$mystring = "My cat likes to eat tomatoes.";
Run Code Online (Sandbox Code Playgroud)
我想用regex对这个字符串进行两次替换.我想做s/cat/dog/
和s/tomatoes/pasta/
.但是,我不知道如何正确格式化正则表达式,在一个表达式中,在一个声明中,在一个表达式中执行多个替换.现在,我只有:
$mystring =~ s/cat/dog/ig;
$mystring =~ s/tomatoes/pasta/ig;
Run Code Online (Sandbox Code Playgroud)
Sin*_*nür 15
像往常一样,使用哈希作为查找表,匹配键,替换为值:
#!/usr/bin/perl
use strict;
use warnings;
use Regex::PreSuf;
my %repl = (
cat => 'dog',
tomatoes => 'pasta',
);
my $string = "My cat likes to eat tomatoes.";
my $re = presuf( keys %repl );
$string =~ s/($re)/$repl{$1}/ig;
print $string, "\n";
Run Code Online (Sandbox Code Playgroud)
输出:
C:\Temp> t My dog likes to eat pasta.
你也可以使用循环:
for my $k ( keys %repl ) {
$string =~ s/\Q$k/$repl{$k}/ig;
}
Run Code Online (Sandbox Code Playgroud)
你为什么想要?
我知道一些Perl-ers自豪能够编写一些可以想象得到的最混淆的代码(参见这里的一些代码高尔夫问题),但这并不能使它成为一个聪明的事情.
保持可读性,并保持这样,从长远来看,你会感谢自己.
编辑:
当然,如果你正在寻找5个或更多的替代品,请(为上帝的母亲)使用某种查找表.但是,不要试图编写一个能够完成所有工作的大规模正则表达式.