Hi,
aus Unerfahrenheit beschäftigt mich die Frage, ob ich in einem Perl-Skript Pausen einlegen muss/sollte, wenn ich ich über curl mehrere API-Endpunkte (sagen wir etwa 20) der gleichen API abrufe.
Ich hab das noch nicht ausprobiert, die Funktionen in einer Schleife hintereinander auszuführen, weil ich mir unsicher bin.
Die Requests würd ich gerne in dem unten angeführten Skript mit einbauen.
Die Frage ist also wie man das richtig macht?
Aktuell bin ich bei 13 Abrufen, die Requests laufen direkt hintereinander in einer Schleife durch und es funzt wie ich es mir vorgestell habe.
So sieht das aktuell aus:
sub mergegooglelocations {
my $sub = sub {
my $filename = shift // return;
my ($error, @content) = FileRead($filename);
Debug "Fehler beim Lesen von $filename: $error\n" if $error;
my $json = join "", @content;
return decode_json($json);
};
my $path = '/opt/fhem/www/googlelocations';
my %seen; # id => Place-HashRef
my $total = 0; # alle Einträge gezählt
my $dupes = 0; # doppelte IDs gezählt
my @dupe_ids; # Liste der doppelten IDs
for (sort glob("$path/location*.json")) {
my $json = $sub->($_);
next if !$json || !exists $json->{places};
for (@{ $json->{places} }) {
# Nur Einträge mit definierter ID
next unless defined $_->{id} && length $_->{id};
$total++;
# Prüfen auf Duplikat
if ( exists $seen{ $_->{id} } ) {
$dupes++;
push @dupe_ids, $_->{id};
Debug "Doppelter Eintrag: $_->{id} - " . ($_->{displayName}{text} // 'unbekannt');
next;
}
# Speichern – flache Kopie, um Referenzprobleme zu vermeiden
$seen{ $_->{id} } = { %$_ };
}
Debug "Verarbeitete Datei: $_";
}
# Werte aus Hash extrahieren
my @merged_places = values %seen;
# JSON schreiben
FileWrite("$path/merged.json",
JSON->new->utf8->pretty->encode({ places => \@merged_places })
);
# Debug-Ausgabe
Debug "Gesamt-Einträge gelesen: $total";
Debug "Einzigartige Einträge: " . scalar(@merged_places);
Debug "Doppelte Einträge: $dupes";
Debug "IDs der doppelten Einträge: " . join(", ", @dupe_ids) if $dupes;
# Datei per scp kopieren
return system("scp $path/merged.json telekom-hosting:/home/www/public_html/assets/src/locations.json");
}
Fertig, bin ich mit dem Code noch nicht, das unless mag ich noch ausbauen und mit encode_json beschäftigen, was damit der Vorteil ist und ob man auf eval dann verzichten kann. Der Zähler der doppelten Einträge ist auch noch um 1 falsch. Das ist aber ein anderes Thema, es funzt erstmal wie es gedacht war.
Gruß Thomas
Ok, man muss nur mal den Kasper machen, um auf andere Gedanken zu kommen.
Wsl. ist es so, dass das holen der Daten, ein ganz anderes Thema ist, wie die spätere Verarbeitung.
Das bekomm ich auch ohne Hilfe hin.