Korrekte Syntax FHEM-Befehl in Perl im ...notify... in myUtils auslagern

Begonnen von TomLee, 10 Juli 2020, 12:34:40

Vorheriges Thema - Nächstes Thema

TomLee

Danke.

Ich komm denk ich auch noch alleine drauf was schief läuft, aber erst später, jetzt geht nicht mehr.

Braucht auch keiner was zu sagen, halt aber auch keinen davon ab:

sub wochentag{
my $v = shift // "my ($day, $month, $year) = (localtime)[3,4,5]; sprintf('%02d.%02d.%s',$month+1,$day,$year+1900)";
my ($d,$m,$y) = split(/\./,$v)};
$m-=1;
my @weekdays = qw(So Mo Di Mi Do Fr Sa);
return $weekdays[((localtime(timelocal('0','0','0',$d,$m,$y)))[6])];
}


Global symbol "$day" requires explicit package name (did you forget to declare "my $day"?) at ./FHEM/99_Calendar_Utils.pm line 14. Global symbol "$month" requires explicit package name (did you forget to declare "my $month"?) at ./FHEM/99_Calendar_Utils.pm line 14. Global symbol "$year" requires explicit package name (did you forget to declare "my $year"?) at ./FHEM/99_Calendar_Utils.pm line 14. Global symbol "$month" requires explicit package name (did you forget to declare "my $month"?) at ./FHEM/99_Calendar_Utils.pm line 14. Global symbol "$day" requires explicit package name (did you forget to declare "my $day"?) at ./FHEM/99_Calendar_Utils.pm line 14. Global symbol "$year" requires explicit package name (did you forget to declare "my $year"?) at ./FHEM/99_Calendar_Utils.pm line 14. Global symbol "$m" requires explicit package name (did you forget to declare "my $m"?) at ./FHEM/99_Calendar_Utils.pm line 16. Global symbol "$d" requires explicit package name (did you forget to declare "my $d"?) at ./FHEM/99_Calendar_Utils.pm line 18. Global symbol "$m" requires explicit package name (did you forget to declare "my $m"?) at ./FHEM/99_Calendar_Utils.pm line 18. Global symbol "$y" requires explicit package name (did you forget to declare "my $y"?) at ./FHEM/99_Calendar_Utils.pm line 18. Unmatched right curly bracket at ./FHEM/99_Calendar_Utils.pm line 19, at end of line ./FHEM/99_Calendar_Utils.pm has too many errors.

In der Kommandozeile macht das my ($day, $month, $year) = (localtime)[3,4,5]; sprintf('%02d.%02d.%s',$month+1,$day,$year+1900) was ich will.


betateilchen

Hinter // solltest Du einfach keinen perl code zur Ausführung schreiben, das macht die Nachvollziehbarkeit extrem unübersichtlich.

Und schon gar nicht perl Code in Anführungszeichen - was soll das sein?
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

JoWiemann

Zitat von: betateilchen am 20 Januar 2023, 19:28:16
Hinter // solltest Du einfach keinen perl code zur Ausführung schreiben, das macht die Nachvollziehbarkeit extrem unübersichtlich.

Und schon gar nicht perl Code in Anführungszeichen - was soll das sein?

Und hier:

my ($d,$m,$y) = split(/\./,$v)}; ist definitiv die } zu viel.
Jörg Wiemann

Slave: RPi B+ mit 512 MB, COC (868 MHz), CUL V3 (433.92MHz SlowRF); FHEMduino, Aktuelles FHEM

Master: CubieTruck; Debian; Aktuelles FHEM

betateilchen

Kommt davon, wenn man sich überall Code-Stücke zusammenklaut, um sie später dann irgendwo als seinen eigenen Code zu präsentieren...
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

JoWiemann

Hallo,

warum vertauscht Du hier sprintf('%02d.%02d.%s',$month+1,$day,$year+1900) Monat und Tag?

und so funktioniert es:


sub wochentag{
   my $v = shift // sprintf('%02d.%02d.%s',(localtime)[3],(localtime)[4]+1,(localtime)[5]+1900);
   my ($d,$m,$y) = split(/\./,$v);
   $m -= 1;
   my @weekdays = qw(So Mo Di Mi Do Fr Sa);
   return $weekdays[((localtime(timelocal('0','0','0',$d,$m,$y)))[6])];
}



Grüße Jörg
Jörg Wiemann

Slave: RPi B+ mit 512 MB, COC (868 MHz), CUL V3 (433.92MHz SlowRF); FHEMduino, Aktuelles FHEM

Master: CubieTruck; Debian; Aktuelles FHEM

TomLee

ZitatKommt davon, wenn man sich überall Code-Stücke zusammenklaut, um sie später dann irgendwo als seinen eigenen Code zu präsentieren...

Heute schon das zweite mal, wo du zeigst das dein Wahrnehmungsvermögen was mich betrifft, völlig daneben liegt.

Zitat
warum vertauscht Du hier sprintf('%02d.%02d.%s',$month+1,$day,$year+1900) Monat und Tag?

Kennst du Diodon ? Hab mich eingedacht, war voll drin in dem Thema, hier und da meine eigenen Beispiele kopiert und das falsche Beispiel am Ende aus der Zwischenablage eingefügt/ausgewählt und nicht mehr bemerkt als ich hier das dann postete. Das mit der schliessenden Klammer hab ich danach auf festgestellt, das da ein Kopierfehler stattfand.
Ja so klappts jetzt wie ich mir das vorgestellt hatte.




Ich muss mich immer wieder eindenken wenn es um Zeiten geht, mich würds jetzt interessieren wie Isegrim bzw. Ihr euch das aktuelle Datum "ziehen" würden ?

JoWiemann

Zitat von: TomLee am 20 Januar 2023, 20:44:02
Heute schon das zweite mal, wo du zeigst das dein Wahrnehmungsvermögen was mich betrifft, völlig daneben liegt.

Bitte an betateilchen adressieren-
Jörg Wiemann

Slave: RPi B+ mit 512 MB, COC (868 MHz), CUL V3 (433.92MHz SlowRF); FHEMduino, Aktuelles FHEM

Master: CubieTruck; Debian; Aktuelles FHEM

TomLee


JoWiemann

Zitat von: TomLee am 20 Januar 2023, 20:53:07
Spatz, du warst gemeint.

Verstehe ich nicht. Habe ich nicht gepostet:

Zitat
Kommt davon, wenn man sich überall Code-Stücke zusammenklaut, um sie später dann irgendwo als seinen eigenen Code zu präsentieren...


Und Spatz schon lange nicht. Lese ich als nicht positiv.
Jörg Wiemann

Slave: RPi B+ mit 512 MB, COC (868 MHz), CUL V3 (433.92MHz SlowRF); FHEMduino, Aktuelles FHEM

Master: CubieTruck; Debian; Aktuelles FHEM

betateilchen

Zitat von: JoWiemann am 20 Januar 2023, 21:21:01
Verstehe ich nicht.

Wahrscheinlich bist Du jetzt der Nächste, dem der Oberkasper "falsches Wahrnehmungsvermögen" vorwerden wird.

Popcorn?  8)
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

JoWiemann

Jörg Wiemann

Slave: RPi B+ mit 512 MB, COC (868 MHz), CUL V3 (433.92MHz SlowRF); FHEMduino, Aktuelles FHEM

Master: CubieTruck; Debian; Aktuelles FHEM

TomLee

Zitat von: JoWiemann am 20 Januar 2023, 21:21:01
Verstehe ich nicht. Habe ich nicht gepostet:

Zitat
Kommt davon, wenn man sich überall Code-Stücke zusammenklaut, um sie später dann irgendwo als seinen eigenen Code zu präsentieren...


Und Spatz schon lange nicht. Lese ich als nicht positiv.


Du warst definitiv nicht gemeint.




Oberkasper, find ich, ist genau das treffende Wort für das was ich die letzten Jahre hier im Forum oft gemacht habe. Sag ich mir auch oft bevor ich hier schreibe -> Wenn du nicht den Kasper machst und doof frägst wird sich in absehbarer Zeit mit hoher Wahrscheinlichkeit auch kein anderer finden/trauen.




Mich hat das mit dem aktuellen Datum weiter beschäftigt und das mit dem vermeiden von Perlcode nach den // der Nachvollziehbarkeit wegen.
Es bleibt ja nix anderes dann übrig wie den Perlcode in einer Variable vor der shift-Zeile zu deklarieren, um dann nur den Variablennamen nach den // anzugeben.
Vermutlich war das aber nicht so gemeint und ich bin noch auf eine andere Variante gekommen:
sub wochentag {
   my $v = shift;
   $v //= localtime->dmy('.');
   my ($d,$m,$y) = split(/\./,$v);
   my @weekdays = qw(So Mo Di Mi Do Fr Sa);
   return $weekdays[((localtime(timelocal('0','0','0',$d,$m-1,$y)))[6])];
}



edit: wie in #149 bereits vorgeschlagen  8)

edit2:
und jetzt noch die return-Zeile angepasst auf die Time::Piece Variante:
(die genauen Hintergründe warum mein System das use ... nicht braucht sind mir noch nicht ganz klar)


sub wochentag {
   my $v = shift;
   $v //= localtime->dmy('.');
   my ($d,$m,$y) = split(/\./,$v);
   my @weekdays = qw(So Mo Di Mi Do Fr Sa);
   return localtime(timelocal('0','0','0',$d,$m-1,$y))->day(@weekdays);
}


edit3: nach weiteren Gedanken noch eine Variante:
sub wochentag {
   my $v = shift;
   my @weekdays = qw(So Mo Di Mi Do Fr Sa);
   $v //= return localtime->day(@weekdays);
   return localtime(time_str2num(join '-', reverse split '\D', $v))->day(@weekdays);
   }


edit4:
vorausgesetzt das ich nicht irgendwas gravierendes übersehe, hier noch eine Variante für die hartnäckigen:

sub wochentag {
   my $v = shift;
   my @weekdays = qw(So Mo Di Mi Do Fr Sa);
   $v //= return localtime->day(@weekdays);
   return localtime(time_str2num(join q(-), reverse split m/[\D]/xms, $v))->day(@weekdays);
};


edit5:

sub wochentag {
   my $v = shift;
   my @weekdays = qw(So Mo Di Mi Do Fr Sa);
   #Time::Piece->use_locale(); # if set german locale, delete line above and (@weekdays) next lines
   $v //= return localtime->day(@weekdays);
   return Time::Piece->strptime($v, '%d.%m.%Y')->day(@weekdays);
}