我正在尝试解析一个html文件,我有一个正则表达式,可捕获所有p标记内的模式。出于某种原因,它只打印出找到的第一个实例。
?:
当我使用下面的测试运行它时,它只打印出第一部分而不打印其他3.当我将if语句切换到while循环时,它不能正常工作。谁能告诉我这里我做错了什么?
my @newH2Array = ("Part I", "Part II", "Part III");
my $linenumber = 0;
while (my $line = <$parser>){
chomp $line;
$linenumber++;
if($line =~ /^<p>/){
if($line =~ /(Part [IVX]+)/gi) {
if (grep{ lc $_ eq lc $1 } @newH2Array){
print "found a hit <" . $1 . "> that matches array element on line" . $linenumber;
}
}
}
}
结果应该是。
<p>Part I should be found. Part II should be found also. Part III should be found.</p>
答案 0 :(得分:3)
if
语句是二元选择。它要么匹配要么不匹配。对于循环,您需要一个循环结构 - 如while
。
我还使用say()
代替print()
,Perl的内置$.
代替$linenumber
,我在字符串中插入变量。
哦,并切换到<DATA>
以便于测试。
#!/usr/bin/perl
use strict;
use warnings;
use feature 'say';
my @newH2Array = ("Part I", "Part II", "Part III");
my $linenumber = 0;
while (my $line = <DATA>){
chomp $line;
if ($line =~ /^<p>/){
while ($line =~ /(Part [IVX]+)/gi) {
if (grep{ lc $_ eq lc $1 } @newH2Array){
say "found a hit <$1> that matches array element on line $.";
}
}
}
}
__DATA__
<p>Part I should be found. Part II should be found also. Part III should be found.</p>
答案 1 :(得分:2)
您正在使用/g
匹配,但由于if
,您只参加了第一场比赛。你需要迭代所有的比赛。一种方法是使用while
循环。
my @newH2Array = ("Part I", "Part II", "Part III", "Part X");
while (my $line = <DATA>){
chomp $line;
if($line =~ /^<p>/){
while ($line =~ /(Part [IVX]+)/gi) {
if (grep{ lc $_ eq lc $1 } @newH2Array){
print "found a hit <$1> that matches array element on line $.\n";
}
}
}
}
__DATA__
<p>Part I should be found. Part II should be found also. Part III should be found.</p>
<p>Part X should be found. Particles are fun.</p>
请注意,我删除了$linenumber
。您可以使用$.
,它始终是最后一个文件句柄的当前行号。
这是输出。
found a hit <Part I> that matches array element on line 1
found a hit <Part II> that matches array element on line 1
found a hit <Part III> that matches array element on line 1
found a hit <Part X> that matches array element on line 2