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:
my @entry_chunks=$site=~m!\Q<center><B>\E(.+?)\Q</B></center>\E!g;
Das ist kurz und klar verständlich.
Hier wie man es machen könnte:
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
use strict;
use warnings;
use POSIX qw(strftime);
use LWP::Simple;
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";
my %found_lines;
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) {
open(my $dbug_fh, '>>', $dbug_file) or die(qq(ERROR open "$dbug_file" "$!"\n));
my $site = get($website);
if($site)
{
my %new_found_lines;
my $offset=0;
my @entry_chunks=$site=~m!\Q<center><B>\E(.+?)\Q</B></center>\E!g;
print $dbug_fh "num chunks: ".scalar(@entry_chunks)."\n";
chomp(@entry_chunks);
for my $i (0..$#entry_chunks)
{
my $found=$entry_chunks[$i];
if(exists($found_lines{$found}))
{
print "$i old: $found\n";
my $moved=$found_lines{$found}-$i;
print $dbug_fh "i:$i offset:$offset moved:$moved old: $found\n";
}
else
{
$offset++;
print "$i new: $found\n";
print $dbug_fh "i:$i offset:$offset new: $found\n";
}
$new_found_lines{$found}=$i;
}
if($offset)
{
my $time_now=strftime('%d-%m-%Y %H:%M',localtime);
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);
}
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);
}
}
%found_lines=%new_found_lines;
print $dbug_fh "offset: $offset\n";
}
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);
sleep($wait_time);
}