Thread Array, Match und $1
(14 answers)
Opened by IceRage at 2011-09-22 22:54
Du machst es dir etwas schwer.
Wenn du die alten Titel lädst, dann brauchst du daraus nicht einen String zu machen in dem du suchst. Du kannst sie auch einen Hash packen, in den du rein schaust. Das ist viel schneller und einfacher. Zudem kann es dir mit der Überprüfung mit index passieren, dass zu viel gefunden wird. Ich kenne das Aussehen der Seite nicht, aber Index würde auch treffen wenn in "Das ist ein Test" nach "ist ein Test" gesucht würde oder "Das ist ein Test:das ist noch ein Text" nach "Test:das". Das kann zu unerwarteten Ergebnissen führen. Auch verstehe ich nicht wofür du $offset braust. Das scheint mir in der Form ungenau. Wenn du wissen willst wo neue Einträge hinzu kamen, dann ist das so nicht gut. Einträge können nicht nur ergänzt, oder gelöscht werden, sie können auch Vertauscht worden sein. Aber auch hier kenne ich die Struktur der Seite nicht. Ich würde jedem Eintrag eine Positionsangabe mitgeben, und diese vergleichen. Das ist zuverlässiger. Weiterhin solltest du die veraltete Schreibweise von open nicht benutzen. Auch solltest du prüfen, ob die Webseite geladen werden konnte. Kommentare sind zum Verständnis hilfreich. Wenn du schon ein "g" verwendest, dann mach es richtig. Du kannst dir gleich alle Einträge holen die du haben möchtest: Code (perl): (dl
)
my @entry_chunks=$site=~m!\Q<center><B>\E(.+?)\Q</B></center>\E!g; Hier wie man es machen könnte: Code (perl): (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 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 #!/usr/bin/perl use strict; use warnings; use POSIX qw(strftime); use LWP::Simple; # alle wichtigen Einstellungen my $website='...'; my $dbug_file='debug.log'; my $line_file='tmp_lines.txt'; my $stat_file='posting_stats.txt'; my $wait_time=60; print "Hello, ScheduledWorld...\n"; # Hash mit den Titeln my %found_lines; # schon mal gefundene Titel Laden wenn vorhanden if(-f $line_file) { open(my $fh, '<', $line_file) or die(qq(ERROR open "$line_file" "$!"\n)); my $pos=0; while(<$fh>) { chomp($_); $found_lines{$_}=$pos; $pos++; } close($fh); } while (1) { # defug datei öffnen open(my $dbug_fh, '>>', $dbug_file) or die(qq(ERROR open "$dbug_file" "$!"\n)); # webseite holen my $site = get($website); # wenn die Seite geladen werden konnte if($site) { # Hash mit den neuen Titeln my %new_found_lines; # Zeigt an wie viele neue Einträge hinzu gekommen sind my $offset=0; # finde alle "Titel" my @entry_chunks=$site=~m!\Q<center><B>\E(.+?)\Q</B></center>\E!g; print $dbug_fh "num chunks: ".scalar(@entry_chunks)."\n"; # Zeilenenden aus den Titeln entfernen chomp(@entry_chunks); # alle gefundenen Titel durch gehen for my $i (0..$#entry_chunks) { my $found=$entry_chunks[$i]; # wenn der Titel schon bekannt ist if(exists($found_lines{$found})) { print "$i old: $found\n"; # titel an anderer stelle? my $moved=$found_lines{$found}-$i; print $dbug_fh "i:$i offset:$offset moved:$moved old: $found\n"; } # wenn der Titel neu ist else { $offset++; print "$i new: $found\n"; print $dbug_fh "i:$i offset:$offset new: $found\n"; } # Titel von der Webseite dem neuen Hash hinzufügen $new_found_lines{$found}=$i; } # list der Titel speichern, # status_datei ergänzen # wenn sich was geändert hat. if($offset) { # aktuelle zeit my $time_now=strftime('%d-%m-%Y %H:%M',localtime); # Titel schreiben if(open(my $line_fh, '>', $line_file)) { print $line_fh join("\n", @entry_chunks); close($line_fh); } else { warn(qq(ERROR open "$line_file" "$!"\n)); print $dbug_fh qq(ERROR open "$line_file" "$!"\n); } # Status schreiben if(open(my $fh, '>>', $stat_file)) { print $fh "offset: $offset\n"; print $fh "$time_now\n"; close($fh); } else { warn(qq(ERROR open "$stat_file" "$!"\n)); print $dbug_fh qq(ERROR open "$stat_file" "$!"\n); } } # alte Titel den Neuen überschreiben %found_lines=%new_found_lines; print $dbug_fh "offset: $offset\n"; } # Fehlermeldung wenn die Seite nicht geladen wurde else { warn "ERROR load website $website\n"; print $dbug_fh "ERROR load website $website!\n"; } print $dbug_fh strftime('%d-%m-%Y %H:%M',localtime); print $dbug_fh "\n################################################################debug\n"; close($dbug_fh); # warten sleep($wait_time); } |