2011-06-23 11 views
3

ので、私は、この持っている:初心者のPerlの問題

for $i ([email protected]) { 
if ($parsedText[$i] =~ /\s{20}<a href/) { 

    my $eventID = $parsedText[$i]; 
    my $eventLink = $parsedText[$i]; 
    my $event_id_title = $parsedText[$i]; 

    $eventID =~ s/[\s\S]*?id=(\d+).*\n/$1/; 
    $eventLink =~ s/[\s\S]*?'(.*?)'.*/$1/; 
    $event_id_title =~ s/\s+<a[\s\S]*?>([^<]*).*\n/$1/; 
    }; 
}; 

をしかし、私はそれらのいずれかを印刷する場合、何らかの理由で、それは代わりに私はそれを返すようにしたい文字列置換の、元の値を返します。

あなたの試合の最初の部分が一致していないので、何の置換は行われませんされているので、あなたにアウトに同じことを取得しているあなたの助け

+2

例を完成させて、印刷方法を正確に示す必要があります。これは重要なことかもしれませんが、この場合は簡単です。 –

+3

:正規表現を使ってhtmlを解析すると肯定票が返されます。とにかく、構文が正しいように見えますが、あなたの正規表現は正しいですか?あなたの入力は何ですか? – NorthGuard

+1

'for'ループは' my $ i(0 .. $#parsedText) 'と書かれています。あなたの例は、1つの要素を最後まで読みます。 Gregと合意すると、データの印刷方法を正確に投稿する必要があります。 –

答えて

5

いただきありがとうございます。

あなたのparsedText配列に改行がないと思う(入力が表示されていないので)。ここでは、上記のやった書き込みの少しクリーンな方法です:一般的に

foreach (@parsedText) { 
    if (/\s{20}<a href/) { 

    (my $eventID = $_)  =~ s/.*?id=(\d+).*/$1/; 
    (my $eventLink = $_)  =~ s/.*?'(.*?)'.*/$1/; 
    (my $event_id_title = $_) =~ s/\s+<a.*?>(.*?)<.*/$1/; 

    print "$eventID, $eventLink, $event_id_title\n"; 
    } 
} 

はあなたがhttp://cpan.orgで収集した知恵の年を使用して、HTML :: Parserの使用の代わりに、このようにHTMLを解析避けるべきであり、HTML: :Parser :: Simple、またはHTML :: TreeBuilder。

+2

+1:「HTML: :Parser'など –

+0

ありがとう、これは問題でした。私は配列を作るために改行で文字列を分割していましたが、正規表現を書くときにすぐにこれを忘れました。また、私はこれらのパーサを調べます...私の非常に基本的な理解では、それは私に少し混乱するかもしれませんが。だから、今後の更なる質問があると期待してください:P – Aelfhere

0

これは動作します...

my $eventID = $parsedText[$i]; 
my $eventLink = $parsedText[$i]; 
my $event_id_title = $parsedText[$i]; 

$eventID =~ s/.*id=['"]?(\d+)['"]?.*/$1/; 
$eventLink =~ s/^.+a\s+href\s*=\s*(['"])([^\1]+)\1.*/$2/; 
$event_id_title =~ s/\s+<a.*?>([^<]*).*/$1/; 

print "$eventID\n"; 
print "$eventLink\n"; 
print "$event_id_title\n"; 

正規表現は注意が必要です。テストプログラムを作成し、必要なものが得られるまで少しずつテストするのが最善です。 HTMLでは一重引用符または二重引用符を使用でき、そのURLには引用符を付けることができます。 IDは数値でなくてもかまいません(私はここでそれを保持していましたが)。

$eventLinkの '\ 1'は、一重引用符または二重引用符を表します。正規表現の一部なので、ドル記号ではなく番号の前にバックスラッシュが必要です。