2017-11-07 1 views
2

정규식을 사용하여 Perl에서 두 구분 기호 사이의 값을 가져 오려고합니다. 파일을 열고 chomp를 사용하여 파일을 한 줄씩 살펴 봅니다. 파일이 보이는 방법의 예 :chomped 줄에서 펄의 구분 기호 사이의 값을 잡아

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

나는 단어의 처음 몇 얻을 수 있어요 "에", "파일을"하지만 난 단지 얻을 "노력"을 할 수없는 세 번째 줄에 "구문 분석" . 나는이 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) – zdim

+2

(HTML에 대한)를 사용하여 당신이 만약 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;