Perl:我如何将变量与另一个变量匹配

时间:2013-01-16 18:23:49

标签: regex perl match

我有以下代码:

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

我从文件中获取$行。我读了整个文件,然后做了一个:

foreach $line in @file {...}

对我来说,它只打印BAAAAAAD。此外,$ line可以包含“清除”,“更清晰”,“最清晰”或其他一些单词,但我希望匹配所有“清除”实例,之后我想匹配所有“更清晰”的实例,依此类推。 注意:“清除”不应与“更清晰”或“更清晰”相匹配。它应该只匹配“清除”

5 个答案:

答案 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

行中较大句子的一部分,这也会有效