2017-11-07 3 views
2

正規表現を使用してPerlで2つの区切り文字の間の値を取得しようとしています。私はファイルを開き、chompを使ってファイルを1行ずつ調べています。ファイルがどのように見えるかの例:コンパイル済みの行からPerlの区切り文字間の値を取得する

"This is <tag> an </tag> example 
of the <tag> file </tag> that I 
am <tag> trying </tag> to <tag> parse </tag>" 

私は単語の最初のカップルを取得することができています:「」、「ファイル」を、私は唯一の獲得「しよう」とすることはできません3行目の「解析」 。私は、これはchompとは何かを持っている疑いがあるが、異なったファイルを解析する方法を見ていない

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

:これは私が使用しようとしていますコードです。

+0

[HTML :: TreeBuilder](http://search.cpan.org/~kentnl/HTML-Tree-5.07/lib/HTML/TreeBuilder.pm)(HTML用) – zdim

+2

あなたの場合HTMLやXMLを処理している場合は、正規表現パターンを使用して独自のライブラリを作成するのではなく、その目的のためにライブラリを使用する必要があります。 – Borodin

答えて

7

私は、これはあなたが一つの値だけをキャプチャし、スカラーに割り当てているので、それがあるムシャムシャ食べる

番とは何かを持っている疑いがあります。

正規表現をグローバルにして(/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; 
8

あなたは複数の一致をつかむために正規表現を変更する必要があります。

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

あなたはこの操作を実行するためにHTMLパーサを使用したほうが良いかもしれません。正規表現でHTMLを解析すると、fraught with perilとなります。例えば、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; 
関連する問題