题
好吧,我得到了一个相当简单的(至少看起来很简单)。我有一个多行字符串,我只是在尝试用其他东西替换不同的单词。我来给你展示...
#!/usr/bin/perl -w
use strict;
$_ = "That is my coat.\nCoats are very expensive.";
s/coat/Hat/igm;
print;
输出将是
That is my Hat
Hats are very expensive...
第一行的“帽子”不应大写。有什么技巧可以让大小写符合英文的书写方式吗?谢谢 :)
解决方案
欲了解更多详情,请访问 如何在 LHS 上不区分大小写地替换,同时在 RHS 上保留大小写?
其他提示
您可以使用e
修饰符s///
这样的伎俩:
s/(coat)/ucfirst($1) eq $1 ? 'Hat' : 'hat'/igme;
有关一个,则应该使用\b
(字边界),以仅整个单词相匹配。例如s/hat/coat/
将改变That
到Tcoat
没有前导\b
。现在,你的问题。旗/e
你可以在正则表达式的替换零件使用Perl代码。这样你就可以写一个Perl函数检查匹配的情况下,然后设置替换的情况下适当地:
my $s = "That is my coat.\nCoats are very expensive.";
$s =~ s/(\bcoat)/&same_case($1, "hat")/igme;
print $s, "\n";
sub same_case {
my ($match, $replacement) = @_;
# if match starts with uppercase character, apply ucfirst to replacement
if($match =~ /^[A-Z]/) {
return ucfirst($replacement);
}
else {
return $replacement;
}
}
打印:
That is my hat.
Hats are very expensive.
这可以解决问题:
#!/usr/bin/perl -w
use strict;
sub smartSubstitute {
my $target = shift;
my $pattern = shift;
my $replacement = shift;
$pattern = ucfirst $pattern;
$replacement = ucfirst $replacement;
$target =~ s/$pattern/$replacement/gm;
$pattern = lcfirst $pattern;
$replacement = lcfirst $replacement;
$target =~ s/$pattern/$replacement/gm;
return $target;
}
my $x = "That is my coat.\nCoats are very expansive.";
my $y = smartSubstitute($x, "coat", "Hat");
print $y, "\n";
不隶属于 StackOverflow