myUtils: Zeitpunkt der letzten Änderung von Datei ermitteln

Begonnen von yersinia, 02 Februar 2024, 08:33:51

Vorheriges Thema - Nächstes Thema

TomLee

#30
OK, und jetzt ? Ich hab keine Doku zwischenzeitlich gewälzt, zum eigentlichen Problem zeigt das jetzt doch, das es nur wie von Jowiemann anfangs schon angedeutet an diesen eval-Deklarationen in der Sub myTest von yersinia liegt :

eval "use File::stat qw( );1;" or push (@missingmodules, "File::stat");
eval "use Time::Piece qw( );1;" or push (@missingmodules, "Time::Piece");
eval "use DateTime                  qw( );1;" or push (@missingmodules, "DateTime");

yersinia

Zitat von: betateilchen am 02 Februar 2024, 17:01:40Logisch, das ist ja auch falsch. Es muss
(stat($filename))[9]heißen. stat() liefert ein array, Du willst aus dem array das Element 9 haben. Also musst Du auch das array korrekt übergeben, wenn Du es nicht einer Variablen zuweisen möchtest. Deshalb die zusätzlichen Klammern (die übrigens auch in meinem Codebeispiel stehen !)
Aber auch nur dann, wenn File::stat nicht doch noch einmal in der Instanz geladen worden ist. Und dies ist auch, so vermute ich, der Grund, warum bei mir
(stat($filename))[9]nicht mehr funktioniert ohne die Instanz neuzustarten. Starte ich FHEM neu, funktioniert der Code direkt ohne Probleme. Lade ich eine myUtils neu, die zufällig noch use File::stat lädt, liefert stat undef zurück.

Zitat von: betateilchen am 02 Februar 2024, 17:01:40Aber...
Zitat von: yersinia am 02 Februar 2024, 16:43:11Ich benötige den Zeitpunkt der letzten Änderung um diesen dann weiter verarbeiten zu können; am liebsten als DateTime-Objekt - das Zielformat ist
%Y%m%dT%H%M%S
Das ist doch noch einfacher zu lösen:
sub test {
  my $filename = "./fhem.pl";
  return POSIX::strftime("%Y%m%dT%H%M%S",localtime((stat($filename))[9]));
}
liefert
20240129T195015
Ich hab mir meinen Code (für die Weiterverarbeitung des Änerungszeitpunkts) nochmal angesehen, das DateTime Objekt ist hier wirklich unnötig, da reicht dein Lösungsvorschlag vollkommen aus. Manchmal denkt man zu kompliziert, danke für den Vorschlag.

Zitat von: betateilchen am 02 Februar 2024, 20:58:25Natürlich funktioniert es dann NICHT.
Das brauche ich gar nicht nachvollziehen, das steht sogar ausdrücklich in der Beschreibung zu File::stat.
ZitatThis module's default exports override the core stat() and lstat() functions, replacing them with versions that return "File::stat" objects.
Das heißt doch eindeutig: die Sache mit dem array funktioniert dann nicht mehr, weil es gar kein array mehr als Rückgabewert gibt.
Das hab ich echt überlesen und kann ich bestätigen; eigtl ist dies eine logische Konsequenz - entweder stat liefert ein array zurück (perl Standard (?)) oder es wird zu einem File::stat Objekt wenn man das Modul einmalig in die Instanz lädt.
Wenn dem aber so wäre,
ZitatThis module's default exports override the core stat() and lstat() functions, replacing them with versions that return "File::stat" objects. This object has methods that return the similarly named structure field name from the stat(2) function; namely, dev, ino, mode, nlink, uid, gid, rdev, size, atime, mtime, ctime, blksize, and blocks.
dann dürfte dieser Fehler
ZitatCan't locate object method "mtime" via package "1" (perhaps you forgot to load "1"?) at ./FHEM/99_myUtils.pm line 36.
gar nicht auftreten, da durch das Laden via use File::stat die Objektmethode auf jedenfall vorhanden sein müsste. (Und ich glaube nicht, dass FHEM hier in irgendeiner Weise der Verursacher wäre)
Oder ich nutze stat($filename)->mtime falsch - oder man gibt für stat das pseudo CORE package an:
return POSIX::strftime("%Y%m%dT%H%M%S",localtime((CORE::stat($filename))[9]));
Danke jdfs für den Input, damit hoffe ich die Fehlermeldung bei initialer Ausführung zu umgehen.  :)
viele Grüße, yersinia
----
FHEM 6.3 (SVN) on RPi 4B with RasPi OS Bullseye (perl 5.32.1) | FTUI
nanoCUL->2x868(1x ser2net)@tsculfw, 1x433@Sduino | MQTT2 | Tasmota | ESPEasy
VCCU->14xSEC-SCo, 7xCC-RT-DN, 5xLC-Bl1PBU-FM, 3xTC-IT-WM-W-EU, 1xPB-2-WM55, 1xLC-Sw1PBU-FM, 1xES-PMSw1-Pl

betateilchen

#32
Zitat von: yersinia am 03 Februar 2024, 16:11:42Oder ich nutze stat($filename)->mtime falsch

Jepp. Richtig wäre:

(stat($filename))->mtime;
Vereinfacht gesagt die Begründung:
Ein Funktionsaufruf alleine ist noch kein Objekt mit Methoden, das Ergebnis des Funktionsaufrufs sehr wohl.
Deshalb die zusätzlichen Klammern.
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

betateilchen

Zitat von: yersinia am 03 Februar 2024, 16:11:42Starte ich FHEM neu, funktioniert der Code direkt ohne Probleme. Lade ich eine myUtils neu, die zufällig noch use File::stat lädt,

Hast Du denn überhaupt einen triftigen Grund, die ohnehin im Standard vorhandene Funktion stat() durch die Funktion aus File::stat zu ersetzen?

Anders gefragt: warum benutzt Du überhaupt irgendwo File::stat?
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

yersinia

Zitat von: betateilchen am 03 Februar 2024, 18:10:07Jepp. Richtig wäre:

(stat($filename))->mtime;
Vereinfacht gesagt die Begründung:
Ein Funktionsaufruf alleine ist noch kein Objekt mit Methoden, das Ergebnis des Funktionsaufrufs sehr wohl.
Deshalb die zusätzlichen Klammern.
Ja, stimmt, so nutze ich es auch - hab es hier falsch zitiert. ::)

Zitat von: betateilchen am 03 Februar 2024, 18:44:35Hast Du denn überhaupt einen triftigen Grund, die ohnehin im Standard vorhandene Funktion stat() durch die Funktion aus File::stat zu ersetzen?

Anders gefragt: warum benutzt Du überhaupt irgendwo File::stat?
File::stat hab ich genutzt, weil stat nicht zum laufen bekommen habe - zumindest schien mir File::stat auch als die "bessere" Option. Allerdings habe ich nun keinen Grund mehr File::stat zu nutzen und kann das Laden des Moduls weglassen.
Für die Zukunft sollte ich allerdings die Testfunktionen sauberer kapseln - und nicht, wie in diesem Szenario, in der gleichen myUtils mit anderen Funktionen welche noch File::stat laden.

Danke jdfs fürs Analyzieren und die investierte Zeit - mit dem einfacheren Lösungsvorschlag und core-stat sollte ich besser, robuster fahren. Ich werds' beobachten. Merci.
viele Grüße, yersinia
----
FHEM 6.3 (SVN) on RPi 4B with RasPi OS Bullseye (perl 5.32.1) | FTUI
nanoCUL->2x868(1x ser2net)@tsculfw, 1x433@Sduino | MQTT2 | Tasmota | ESPEasy
VCCU->14xSEC-SCo, 7xCC-RT-DN, 5xLC-Bl1PBU-FM, 3xTC-IT-WM-W-EU, 1xPB-2-WM55, 1xLC-Sw1PBU-FM, 1xES-PMSw1-Pl