从 chomped 行中获取 Perl 中定界符之间的值
Grab values between delimiters in Perl from chomped line
我正在尝试使用正则表达式获取 Perl 中两个定界符之间的值。我正在打开一个文件并使用 chomp 逐行浏览文件。文件外观示例:
"This is <tag> an </tag> example
of the <tag> file </tag> that I
am <tag> trying </tag> to <tag> parse </tag>"
我能得到前几个字:"an"、"file",但在第三行我只能得到"trying"而不能得到"parse"。这是我尝试使用的代码:
while (chomp($line = <$filename>)){
($tag) = $line =~ m/<tag>(.*?)<\/tag>/;
push(@tagarray, $tag);
}
我怀疑这与 chomp
有关,但看不出如何以不同方式解析文件。
您需要修改正则表达式以获取多个匹配项:
my @tags = $line =~ m/<tag>(.*?)<\/tag>/g;
您最好使用 HTML 解析器来执行此操作。用正则表达式解析HTML是fraught with peril. For example, take a look at 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;
I suspect this has something to do with chomp
没有。这是因为您只捕获一个值并将其分配给标量。
使正则表达式成为全局 (/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;
我正在尝试使用正则表达式获取 Perl 中两个定界符之间的值。我正在打开一个文件并使用 chomp 逐行浏览文件。文件外观示例:
"This is <tag> an </tag> example
of the <tag> file </tag> that I
am <tag> trying </tag> to <tag> parse </tag>"
我能得到前几个字:"an"、"file",但在第三行我只能得到"trying"而不能得到"parse"。这是我尝试使用的代码:
while (chomp($line = <$filename>)){
($tag) = $line =~ m/<tag>(.*?)<\/tag>/;
push(@tagarray, $tag);
}
我怀疑这与 chomp
有关,但看不出如何以不同方式解析文件。
您需要修改正则表达式以获取多个匹配项:
my @tags = $line =~ m/<tag>(.*?)<\/tag>/g;
您最好使用 HTML 解析器来执行此操作。用正则表达式解析HTML是fraught with peril. For example, take a look at 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;
I suspect this has something to do with chomp
没有。这是因为您只捕获一个值并将其分配给标量。
使正则表达式成为全局 (/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;