0

我有以下代码:

 $st2 = quotemeta($st);
 if ( $line =~ m/$st2\z/ ) {
     print "GOOD\n";
 }
 else {
     print "BAAAAAAD\n";
 }

$line 我从文件中得到它。我阅读了整个文件,然后执行以下操作:

foreach $line in @file {...}

对我来说,它只打印 BAAAAAAD。此外,$line 可以包含“clear”、“clearer”、“clearest”或其他一些词,但我想匹配所有“clear”实例,后记我想匹配所有“clearer”实例等等。注意:“clear”不应匹配“clearer”或“clearest”。它应该只匹配“清除”

4

5 回答 5

2

首先,如果你通过一个文件进行搜索,不要完全阅读它,而是逐行搜索。您也不需要使用quotemeta,除非您只想搜索纯字符串。如果您想在该行的任何位置找到“清除”一词,请\z在搜索模式中省略。最后,您的字符串包含最后一个换行符,它可以防止\z看到字符串的结尾。用于chomp删除尾随换行符

my $st = 'clear';
while (<>) {
    chomp;
    if (m/$st\z/) {
        print "GOOD\n";
    } else {
        print "BAAAAAAD\n";
    }
}

参见perlreperl 正则表达式的解释

\z 仅匹配字符串末尾

如果您只想在行中的任何位置搜索纯字符串,您可以使用index

my $st = 'clear';
while (<>) {
    if (index($_, $st) != -1/) {
        print "GOOD\n";
    } else {
        print "BAAAAAAD\n";
    }
}
于 2013-01-16T18:33:44.053 回答
1

如果要匹配确切的单词,请使用\b单词边界。例如/\bclear\b/匹配clear但不匹配clearer。当您要查找的单词不是字符串中的唯一单词时,这很有用。

于 2013-01-17T09:54:40.630 回答
0

尝试使用 qr($your_var)
这里有一个有用的链接:http:
//perldoc.perl.org/perlop.html#Regexp-Quote-Like-Operators

于 2013-01-16T20:00:05.703 回答
0

这是有效的:

my $var1 = "clear";
my $var2 = "clear";
if ($var2 eq $var1) {
    print "match\n";
}
else {
    print "no match\n";
}

当 $var1 “更清晰”时,这也有效(显示“不匹配”)。

感谢大家的帮助。

于 2013-01-17T05:28:11.653 回答
0

您可以使用单词边界,以下代码段将匹配匹配“clear”、“clearer”或“clearest”的所有行,清楚地告诉您匹配的内容

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是该行中较大句子的一部分,这也将起作用

于 2013-01-17T11:53:40.197 回答