从chomped行中获取Perl中分隔符之间的值

vla*_*tin 2 regex perl chomp

我试图使用正则表达式获取Perl中两个分隔符之间的值.我正在打开一个文件并使用chomp逐行浏览文件.该文件的外观示例:

"This is <tag> an </tag> example
of the <tag> file </tag> that I
am <tag> trying </tag> to <tag> parse </tag>"
Run Code Online (Sandbox Code Playgroud)

我能够得到前几个词:"an","file",但在第三行我只能"尝试"而不是"解析".这是我尝试使用的代码:

while (chomp($line = <$filename>)){
   ($tag) = $line =~ m/<tag>(.*?)<\/tag>/;
   push(@tagarray, $tag);
}
Run Code Online (Sandbox Code Playgroud)

我怀疑这与某些事情有关,chomp但是没有看到如何以不同方式解析文件.

mwp*_*mwp 8

您需要修改正则表达式以获取多个匹配项:

my @tags = $line =~ m/<tag>(.*?)<\/tag>/g;
Run Code Online (Sandbox Code Playgroud)

您可能最好使用HTML解析器来执行此操作.用正则表达式解析HTML 充满了危险.例如,看一下HTML :: TagParser:

my $html = HTML::TagParser->new(<<'EOF');
This is <tag> an </tag> example
of the <tag> file </tag> that I
am <tag> trying </tag> to <tag> parse </tag>
EOF

my @tags = $html->getElementsByTagName('tag');
my @tagarray = map { $_->innerText() } @tags;
Run Code Online (Sandbox Code Playgroud)


Que*_*tin 7

我怀疑这与chomp有关

不.这是因为您只捕获一个值并将其分配给标量.

使regex global(/g)并将结果存储在数组中.

#!/usr/bin/env perl

use strict;
use warnings;
use v5.10;

my $line = "am <tag> trying </tag> to <tag> parse </tag>";
my @tags;
(@tags) = $line =~ m/<tag>(.*?)<\/tag>/g;
say join ",", @tags;
Run Code Online (Sandbox Code Playgroud)