Schrift
[thread]8308[/thread]

Datei auf vorhanden String untersuchen



<< >> 2 Einträge, 1 Seite
Gast Gast
 2006-09-09 00:23
#69600 #69600
Hi,

versuche gerade ein RSS auszuwerten und das Ergebnis in eine Datei zu schreiben.

Der Code funktioniert auch soweit und gibt in der Zeile
print "$title\n$item->{link}\n\n"; # Nur zum Test
auch den richtigen Wert aus.

Nur möchte ich natürlich keine doppelten Links haben die im RSS enthalten sind, aber irgendwie scheint das wohl nicht so zu funktioneren wie ich mir das vorstelle.

Irgendwie habe ich den Verdacht das meine Methode die Datei auf das vorhandensein der Werte überprüft nicht gerade glücklich gewählt ist.
Eigentlich dachte ich das ich den Eintrag mit = nur Auswerten brauche aber dem ist wohl nicht so.

Vielleicht nur ein Anfängerfehler. Zumindest kommen keine Warnings.


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
49
#!/usr/bin/perl

use XML::RSSLite;
use LWP::Simple;
use strict;
use warnings;

# list of keywords we want
my @keywords = qw(Testlink 4400);

# get the RSS
my $URL = 'xttp://datalux/rss.xml';
my $content = get($URL);

# Parse the RSS
my %result;
parseRSS(\%result, \$content);

# build the regex from keywords
my $re = join "|", @keywords;
$re = qr/\b(?:$re)\b/i;

open TEMP, ">>list"
or die "Konnte Datei nicht öffnen ($!)";

# print report of matching items
foreach my $item (@{ $result{items} }) {
my $title = $item->{title};
$title =~ s{\s+}{ }; $title =~ s{^\s+}{ }; $title =~ s{\s+$}{ };

if ($title =~ /$re/) {
print "$title\n$item->{link}\n\n"; # Nur zum Test

open READ_TEMP, "<list"
or die "Konnte Datei READ_TEMP nicht öffnen $!";

foreach (<READ_TEMP>) {
if ($_ = "$title\n$item->{link}\n\n") {
#print "done\n"; # Nur zum Test
}
else {
print TEMP "$title\n$item->{link}\n\n";
print "written\n";
}
close READ_TEMP;
}
}
}
close TEMP;


Sowas steht dann pro Link in der Datei list wenn ich die if Abfrage abschalte.
<code>
Beispiel eines Links
xttp://datalux/download.php?info_hash=29c898f8484ee70ad7d67d3a786d8b293752c626

</code>
murphy
 2006-09-09 20:44
#69601 #69601
User since
2004-07-19
1776 Artikel
HausmeisterIn
[Homepage]
user image
Deine Methode zum Überprüfen auf doppelte Einträge hat mehrere Probleme. In Reihenfolge des Auftretens im Code:

1) foreach (<READ_TEMP>) ... ist relativ ineffizient, denn es liest zunächst die gesamte Datei in eine Liste im Speicher ein und iteriert dann über sie. Sinnvoller ist wohl while (<READ_TEMP>) ... um Datensatzweise einzulesen.

2) Wenn du in der foreach oder while Schleife in $_ mehr als nur eine Zeile haben willst, solltest du die Eingabedatensatztrennmarkierung entsprechend setzen, also in Deinem Fall zum Beispiel { local $/ = ''; local $_; while (<READ_TEMP>) ... }. (Siehe perlvar für mehr Informationen zu $/ und perlop dazu, warum ich auch $_ lokalisiere.)

3) Die Anweisung $_ = "$title\n$item->{link}\n\n" ist kein logischer Ausdruck, sondern eine Zuweisung. Du meinst vermutlich $_ == "$title\n$item->{link}\n\n", was aber auch verkehrt ist, denn das wäre ein numerischer Vergleich. Eigentlich wäre wohl chomp; if ($_ eq "$title\n$item->{link}") ... am besten.

4) Da du die gleiche Datei, die Du schreibst, auch wieder einliest, solltest du nach jedem ausgegebenen Datensatz die Ausgabepuffer leeren, damit die Daten auch wirklich in der Datei angekommen sind bevor sie wieder eingelesen werden sollen.

Zu guter letzt noch ein Tip: Wenn Deine RSS-Feeds nicht riesig sind, verwende statt linearer Suche durch Dateien lieber einen Hash um zu speichern, ob Du einen Eintrag schon geschrieben hast.
When C++ is your hammer, every problem looks like your thumb.
<< >> 2 Einträge, 1 Seite



View all threads created 2006-09-09 00:23.