Perl正则表达式不符合预期

时间:2014-04-19 18:45:16

标签: arrays regex perl

我正在尝试将列表中的每个单词与字符串进行比较以查找匹配的单词,但我似乎无法使其工作。

以下是一些示例代码

my $sent = "this is a test line";


foreach (@keywords) {      # array of words (contains the word 'test')
  if ($sent =~ /$_/) {
    print "match found";
  }
}

如果我手动输入/test/而不是$_似乎有效,但我无法手动输入字词。

1 个答案:

答案 0 :(得分:0)

您的代码运行正常。我希望你在真正的计划中有use strictuse warnings吗?这是一个示例,其中我填充了@keywords一些项目,包括test

use strict;
use warnings;

my $sent = "this is a test line";
my @keywords = qw/ a b test d e /;

foreach (@keywords) {
   if ($sent =~ /$_/) {
     print "match found\n";
   }
}

<强>输出

match found
match found
match found

所以你的数组并不包含你的想法。我敢打赌,您已经从文件或键盘上读取数据,忘记使用chomp从每个单词的末尾删除换行符。

你可以通过简单地写

来做到这一点
chomp @keywords

将从@keywords的所有元素的末尾删除换行符(如果有的话)。要查看@keywords的真实内容,您可以将这些行添加到您的程序

use Data::Dumper;
$Data::Dumper::Useqq = 1;
print Dumper \@keywords;

您还会看到元素ae产生匹配以及test,我想您不想要。您可以在\b的值之前和之后添加单词边界元字符$_,就像这样

foreach (@keywords) {
   if ( $sent =~ /\b$_\b/ ) {
     print "match found\n";
   }
}

但正则表达式对的定义非常严格,只允许使用字母数字字符或下划线_,因此Roger's,{{1} },"essay"99%不是&#34;字&#34;在这个意义上。根据您的实际数据,您可能需要不同的东西。

最后,我会使用nicely-formatted而不是for(它们在各方面都是相同的)和{{1的后缀语句修饰符形式 - 更紧凑地编写此循环像这样

foreach