0

Ical フィードからのイベント情報を解析するコードに取り組んでいます。キーワードで分けたいデータの巨大なブロックです。秩序ある方法でそれを行う必要があります。重要な用語に索引を付けてから、それらの索引の間にあるものをプログラムに出力させてみました。しかし、何らかの理由で、すべてのデータを印刷する無限ループになりました。修正方法がわかりません。コードを実行しないでください。コンピューターがフリーズし続けます。誰かが私の問題が何であるかを教えてくれることを望んでいました。

このプログラムを実行しないでください

use strict;
use warnings;


use LWP::Simple;
use HTML::TreeBuilder;
use HTML::FormatText;

my $URL= get("https://www.events.utoronto.ca/iCal.php?ical=1&campus=0&
+sponsor%5B%5D=&audience%5B%5D=&category%5B%5D=");

my $Format=HTML::FormatText->new;
my $TreeBuilder=HTML::TreeBuilder->new;
$TreeBuilder->parse($URL);
my $Parsed=$Format->format($TreeBuilder);
open(FILE, ">UOTSUMMER.txt");
print FILE "$Parsed";
close (FILE);

open (FILE, "UOTSUMMER.txt");
my @array=<FILE>;

my $string ="@array";
my $offset = 0;     # Where are we in the string?


my $numResults = 0;

while (1) {
    my $idxSummary = index($string, "SUMMARY", $offset);
    my $result = "";
    my $idxDescription = index ($string, "DESCRIPTION", $offset);
    my $result2= "";
    if ($idxSummary > -1) {
        $offset = $idxSummary + length("SUMMARY");
        my $idxDescription = index($string, "DESCRIPTION", $offset);
        if ($idxDescription == -1) {
            print "(Data malformed: missing DESCRIPTION line.)\n";
            last;
        }
        if ($idxDescription > -1) {
            $offset = $idxDescription+ length("DESCRIPTION");
            my $idxLocation= index($string, "LOCATION", $offset);
            if ($idxLocation == -1) {
                print "(Data malformed: missing LOCATION line.)\n";
                last;
            } 

            my $length = $idxDescription - $offset;
            my $length2= $idxLocation - $offset;
            $result = substr($string, $offset, $length);
            $result2= substr ($string, $offset, $length2);

            $offset = $idxDescription + length("DESCRIPTION");
            $result =~ s/^\s+|\s+$//g ; # Strip leading and trailing white space, including newlines.
            $result2 =~ s/^\s+|\s+$//g ; 

            $numResults++;
        } else { 
            print "(All done. $numResults result(s) found.)\n";
            last; 
        }

        open (FILE2, "UOT123.txt")
        print FILE2 "TITLE: <$result>\n DESCRIPTION: <$result2>\n"; 

あなたが持っているかもしれないどんなガイダンスも大歓迎です!ありがとう!

4

2 に答える 2

0

おそらく、以下が構文解析タスクに役立ちます。

use Modern::Perl;
use LWP::Simple qw/get/;
use HTML::Entities;

my $html = get 'https://www.events.utoronto.ca/iCal.php?ical=1&campus=0&+sponsor%5B%5D=&audience%5B%5D=&category%5B%5D=';

while ( $html =~ /(Summary:\s*[^\n]+)\s*(Description:\s*[^\n]+)/gi ) {
    say decode_entities($1) . "\n" . decode_entities($2);
}

サンプル出力:

SUMMARY:Learning Disabilities Parent Support Group
DESCRIPTION: Dates: Thursdays: May 24, June 21, and July 19

SUMMARY:"Reading to Write"
DESCRIPTION: Leora Freedman, Coordinator, English Language Learning Program, Faculty of Arts  &  Science

SUMMARY:The Irish Home Rule Bill of 1912:  A Centennial Symposium
DESCRIPTION: One-day symposium presented by the Celtic Studies Program, St. Michael's College

テキスト内でhtmlエンティティに問題がない場合は、使用HTML::Entitiesdecode_entities($1)表記を省略できます。そうしないと、次のような結果が得られる可能性があります。

DESCRIPTION: Leora Freedman, Coordinator, English Language Learning Program, Faculty of Arts  &amp;  Science

お役に立てれば!

于 2012-08-17T17:50:17.980 に答える
0

私はあなたの警告に非常に触発されたので、それを実行しなければなりませんでした. そのために必要なモジュールもインストールしました。お使いのコンピューターはおそらく、実際にはクラッシュしているのではなく、エンドレス ループによって動かなくなっているだけです。

コードを見ると、問題はほぼ間違いなくインデックス作成です。現状では、ループ ロジックは混乱しています。あなたの最善の策は、これをどのように行っているかを再考することです. このロジックをすべて使用するのではなく、ファイルの処理に依存するループを作成してみてください。そうすれば、無限ループを作るのはずっと難しくなります。また、正規表現を使用すると、この作業がはるかに簡単になります。これはおそらくあなたが望むものとまったく同じではありませんが、それは始まりです:

while ($string =~ m/SUMMARY(.+?)DESCRIPTION(.+?)(?=SUMMARY|$)/gcs)
{
    print "summary is: \n\n $1 \n\n description is: \n\n $2 \n\n";
}

その他の簡単なポイント:

  • ファイルに書き込んでから開き、最初から内容を読み返すのはあまり意味がありません。$Parsed には、まさに必要なものが既にあります。
  • 変数を単独で出力したい場合は、引用符で囲まないでください。これにより、多くのオーバーヘッドが追加されます。
于 2012-08-17T17:09:17.213 に答える