Thread Array, Match und $1 (14 answers)
Opened by IceRage at 2011-09-22 22:54

topeg
 2011-09-23 12:02
#152611 #152611
User since
2006-07-10
2611 Artikel
BenutzerIn

user image
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;
Das ist kurz und klar verständlich.

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);
}

View full thread Array, Match und $1