我有以下代码:
$st2 = quotemeta($st);
if ( $line =~ m/$st2\z/ ) {
print "GOOD\n";
}
else {
print "BAAAAAAD\n";
}
我从文件中获取$行。我读了整个文件,然后做了一个:
foreach $line in @file {...}
对我来说,它只打印BAAAAAAD。此外,$ line可以包含“清除”,“更清晰”,“最清晰”或其他一些单词,但我希望匹配所有“清除”实例,之后我想匹配所有“更清晰”的实例,依此类推。 注意:“清除”不应与“更清晰”或“更清晰”相匹配。它应该只匹配“清除”
答案 0 :(得分:2)
首先,如果您浏览文件进行搜索,请不要完全阅读,而是逐行搜索。您也不需要使用quotemeta,除非您只想搜索纯字符串。如果您想在该行的任何位置找到“清除”一词,请在搜索模式中省略\z
。最后,您的字符串包含最终换行符,这会阻止\z
看到字符串的结尾。使用chomp
删除尾随换行符
my $st = 'clear';
while (<>) {
chomp;
if (m/$st\z/) {
print "GOOD\n";
} else {
print "BAAAAAAD\n";
}
}
有关perl正则表达式的解释,请参阅perlre
\ z仅在字符串末尾匹配
如果您只想在该行的任何位置搜索纯字符串,可以使用index
my $st = 'clear';
while (<>) {
if (index($_, $st) != -1/) {
print "GOOD\n";
} else {
print "BAAAAAAD\n";
}
}
答案 1 :(得分:1)
如果您想匹配确切的字词,请使用\b
作为字边界。例如。 /\bclear\b/
与clear
匹配,但与clearer
不匹配。当您要查找的单词不是字符串中的唯一单词时,这非常有用。
答案 2 :(得分:0)
尝试使用qr($ your_var)
这里有一个有用的链接:
http://perldoc.perl.org/perlop.html#Regexp-Quote-Like-Operators
答案 3 :(得分:0)
这是有效的:
my $var1 = "clear";
my $var2 = "clear";
if ($var2 eq $var1) {
print "match\n";
}
else {
print "no match\n";
}
当$ var1为&#34;更清晰&#34;时,这也有效(显示&#34;不匹配&#34;)。
谢谢大家的帮助。
答案 4 :(得分:0)
您可以使用单词边界,以下代码段将匹配所有匹配“清除”,“更清晰”或“更清晰”的行,清楚地告诉您匹配的内容
my @matches = qw/clear clearer clearest/;
for $line ( @lines ) {
for ( @matches ) {
print "GOOD: Matches $_" if $line =~ /\b$_\b/;
}
}
当我针对这样的输入运行时:
my @lines = (
'clear',
'clearer',
'clearest',
'clear',
'clearer'
);
输出结果为:
GOOD: Matches clear
GOOD: Matches clearer
GOOD: Matches clearest
GOOD: Matches clear
GOOD: Matches clearer
如果clear
是