Thread RegEx gesucht: ziemlich groß (8 answers)
Opened by pktm at 2003-09-30 21:46

Dubu
 2003-10-03 16:14
#59181 #59181
User since
2003-08-04
2145 Artikel
ModeratorIn + EditorIn

user image
Diese Loesung ist ineffizient, weil du zweimal die gesamte Datei parst.
Ausserdem ist immer noch dieses komische "print \print_koords(*DATA)->{1}" da drin, dessen Sinn mir nicht klar ist. Hast du denn mal in die Doku zu HTML::Parser hineingeschaut? Ich weiss, die ist ziemlich lang, aber die Methodenaufrufe stehen ziemlich weit oben, da steht auch, dass ein $p->parse_file() einfach das $p oder - bei Fehler - undef zurueckliefert.

Leider sagst du nicht, wie die 'img' und 'input' Tags zusammen haengen. Wie stehen diese in der Datei? Abwechselnd? Wie machst du die Zuordnung?

Nun ja, ich gehe mal davon aus, dass die Tags jeweils in der gleichen Reihenfolge stehen und sich somit in Arrays sammeln lassen. Eleganter waere es, die Zuordnung und Weiterverarbeitung gleich im Handler vorzunehmen, aber mit globalen Arrays geht es auch.

Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
#!/usr/bin/perl
use warnings;
use strict;
use HTML::Parser;

my (@Staedte, @Koord1, @Koord2);    # globale Variablen fuer Parser-Ergebnisse

sub parse_start {
   if ($_[0] eq 'img') {
       return unless exists $_[1]->{alt}; # alt-Attribute vorhanden?
       push @Staedte, $_[1]->{alt};
   } elsif ($_[0] eq 'input') {
       if ($_[1]->{name} eq 'k1') {
           push @Koord1, $_[1]->{value};
       } elsif ($_[1]->{name} eq 'k2') {
           push @Koord2, $_[1]->{value};
       }
   }
}

my $p = HTML::Parser->new ( api_version => 3,
   start_h => [        # Handler fuer Start-Tags
       \&parse_start,
       'tag, attr',    # Uebergib Tag und Attribute
   ],
);
$p->report_tags (qw(img input)); # nur diese Tags beachten

$p->parse_file(*DATA);

# Ausgabe der Ergebnisse
for (0..$#Staedte) {
   print "$Staedte[$_]\n===> ($Koord1[$_], $Koord2[$_])\n";
}

_ _DATA_ _
<a href='anzeig.pl?lnr=2689&art=stadt&nr=5048'><img border="0" src="http://free.pages.at/Praios/bilder//karte/k1j.jpg" width="118" height="118" alt='Name: Un-Rockbar
Besitzer: Ice_King
Punkte: 144
Bündnis: FuckingGrandpas'></a><a href='anzeig.pl?lnr=2689&art=stadt&nr=5049'><img border="0" src="http://free.pages.at/Praios/bilder//karte/k1j.jpg" width="118" height="118" alt='Name: Ulgarth
Besitzer: Core
Punkte: 1202
Bündnis: DDH'></a>
<!-- kommen die einfach hier hinter??? -->
<p class='mitte'>Mittlere Koordinate:<input type="text" name="k1" value="52" maxlength="3" size="3">.<input type="text" name="k2" value="48" maxlength="3" size="3">
<input type="submit" value="Go" name="go"></p>
<p class='mitte'>Mittlere Koordinate:<input type="text" name="k1" value="42" maxlength="3" size="3">.<input type="text" name="k2" value="24" maxlength="3" size="3">
<input type="submit" value="Go" name="go"></p>

Das _ _DATA_ _ bitte wieder zusammenfuegen.

Mit dem report_tags() habe ich noch eine kleine Optimierung eingebaut, damit der Handler nicht so oft aufgerufen werden muss.

View full thread RegEx gesucht: ziemlich groß