Hallo,
ich wollte mir in das Snips-Modul eine Sprachauswahl bei der Sprachausgabe einbauen und bin dabei auf die Funktion "parsParams" gestoßen.
https://wiki.fhem.de/wiki/DevelopmentModuleAPI#parseParams
Jetzt hab ich die Beispiele durchgespielt, aber irgendwas will nicht funktionieren:
sub testPP(){
my $cmd = 'set name test1 test2=abc test3 "test4 test4" test5="test5 test5" test6=\'test6=test6\' test7= test8="\'" test9=\'"\' {my $x = "abc"} test10={ { my $abc ="xyz" } }';
print Dumper parseParams( $cmd );
}
in einer 99_Utils.pm
Ergibt im Logfile:
$VAR1 = [
'set',
'name',
'test1',
'test2=abc',
'test3',
'test4 test4',
'test5="test5',
'test5"',
'test6=\'test6=test6\'',
'test7=',
'test8="\'"',
'test9=\'"\'',
'{my $x = "abc"}',
'test10={',
'{ my $abc ="xyz" }',
'}'
];
$VAR2 = {};
Dabei sollten doch die Wertpaare in $VAR2 landen, wie hier beschrieben:
https://forum.fhem.de/index.php/topic,52242.msg440353.html#msg440353
Bin ich gerade blind?
Bei mir geht es$VAR1 = [
'set',
'name',
'test1',
'test3',
'test4 test4',
'{my $x = "abc"}'
];
$VAR2 = {
'test10' => '{ { my $abc ="xyz" } }',
'test6' => 'test6=test6',
'test7' => '',
'test8' => '\'',
'test5' => 'test5 test5',
'test2' => 'abc',
'test9' => '"'
};
Ich habe per copy/paste deine Funktion in myUtils übernommen, und dann {testPP()} in Fhem eingegeben
Mhm, Update gemacht, jetz gehts wohl
$VAR1 = [
'set',
'name',
'test1',
'test3',
'test4 test4',
'{my $x = "abc"}'
];
$VAR2 = {
'test7' => '',
'test6' => 'test6=test6',
'test9' => '"',
'test10' => '{ { my $abc ="xyz" } }',
'test5' => 'test5 test5',
'test8' => '\'',
'test2' => 'abc'
};
Davor wars eine fhem.pl Version vom 18.11. (?).
Egal jetzt gehts erstmal...
Da ist es wieder kaputt gegangen...
$VAR1 = [
'set',
'name',
'test1',
'test2=abc',
'test3',
'test4 test4',
'test5="test5',
'test5"',
'test6=\'test6=test6\'',
'test7=',
'test8="\'"',
'test9=\'"\'',
'{my $x = "abc"}',
'test10={',
'{ my $abc ="xyz" }',
'}'
];
$VAR2 = {};
Außerdem bekomme ich "ab und an" im Log beim aufrufen der Testfunktion
2018.12.20 14:15:11 1: PERL WARNING: print() on unopened filehandle Dumper at ./FHEM/99_testUtils.pm line 43.
2018.12.20 14:15:11 3: eval: {testPP}
Ich habe das Gefühl, da stehen irgendwelche Funktionen zu manchen Zeitpunkten nicht zur Verfügung...
Ist das nich eine Anfängerfrage? Können wir dafür ein geeigneteres Board finden?
Danke,
Oli
Kurz, weil mobil
Ich habe Dein Beispiel in ein at mit alle 1 sekunde laufen lassen und nach 120s hatte ich nicht einen Fehler. Es wird wohl an Deinem System liegen. Denke ich.
Was ist 99_testUtils.pm ?
Also jetzt geht es gerade wieder.
In
99_testUtils.pm habe ich meine Testfunktionen ausgelagert.
Die, die ich hier als Beispiel verwende, habe ich aber komplett aus den oben verlinkten Threads/Wikis kopiert.
Ich hab das unter Anfängerfragen weil ich kaum Ahnung von Perl habe => "Anfänger".
V.a. weiß ich nicht, nach was/wie ich suchen soll, wenn da wieder was rum spinnt.
Ich gebe
{testPP}
in die Eingabezeile ein. Und manchmal funktioniert es richtig, manchmal werden keine Wertpaare gefunden und machmal kam auch dieser Output, mit dem ich nix anfangen kann:
2018.12.20 14:15:11 1: PERL WARNING: print() on unopened filehandle Dumper at ./FHEM/99_testUtils.pm line 43.
2018.12.20 14:15:11 3: eval: {testPP}
- Die erste Fehlermeldung kann man googeln, darum dachte ich, dass vielleicht etwas nicht fertig/richtig geladen ist:
https://www.perlmonks.org/?node_id=780755
ZitatWhen the parser sees the line "print Dumper %test_hash;", the Dumper sub has not been imported yet, so it treats it as a filehandle.
- Was kann das zweite bedeutem:
eval: {testPP} ?
Und eigentlich nutzt
parseParams in der fhem.pl ja eigentlich nicht FHEM-spezielles, wenn ich das richtig überblicke. Das sollte doch "immer" funktionieren?
Ich beobachte das mal weiter und versuche ein Muster zu erkennen; bin aber auch für Hinweise, wo/wie ich suchen kann dankbar.
€: Mein System läuft in einer VM auf Ubuntu Server 16.04
fhem.pl 18003 2018-12-19 10:45:16Z rudolfkoenig
99_testUtils ist keine standard Datei von Fhem. Wie wird es geladen?
Zitat von: amenomade am 20 Dezember 2018, 23:22:25
99_testUtils ist keine standard Datei von Fhem. Wie wird es geladen?
99_.* wird immer geladen, aber guter Hinweis, Macht der TE nach Änderungen ein reload? Nach Änderungen an Funktionsschnittstellen ein restart?
Kurz, weil mobil
Zitat99_.* wird immer geladen
Ja, aber in welcher Ordnung? Wann und wo wird "use Data::Dumper" gemacht?
Zitat von: KernSani am 21 Dezember 2018, 06:02:29
99_.* wird immer geladen, aber guter Hinweis, Macht der TE nach Änderungen ein reload? Nach Änderungen an Funktionsschnittstellen ein restart?
Funktionsschnittstelle = Modul?
Wenn ich direkt an Modulen, bspw. jetzt hier an 10_SNIPS.pm was mache, dann mache ich zwar keinen restart aber ein
reload 10_SNIPS.pmZitat von: amenomade am 21 Dezember 2018, 08:43:27
Ja, aber in welcher Ordnung? Wann und wo wird "use Data::Dumper" gemacht?
Reihenfolge habe ich keine Ahnung, ich habe mich nur an den 99-Leitfaden orientiert:
https://wiki.fhem.de/wiki/99_myUtils_anlegen
ZitatDer Dateiname muss mit 99_ beginnen. FHEM lädt beim Start alle Programmdateien mit dem prefix 99_. Andere Programmdateien werden erst dann geladen, wenn sie durch eine define-Anweisung in der Konfiguration angefordert werden. So wird z.B. 10_FS20.pm erst geladen, wenn beim Einlesen der Konfiguration das erste define für ein FS20-device abgearbeitet wir
Wobei
Start jetzt halt vielleicht etwas allgemein ist.
Und use Data::Dumper nutze ich nur, weil das Beispiel eben so war und man damit aus meiner Sicht komfortabel so eine Struktur ausgeben kann. Ich lad das selber nicht manuell und kann ("Anfänger") auch nicht nachvollziehen, wo das geschieht.
Hast Du irgendwo in 99_testUtils ein use Data::Dumper
?
Der Weihnachtsurlaub hat begonnen, daher zum einen niedrige Antwortfrequenz und zum anderen keinen Zugriff auf FHEM.
Zitat von: amenomade am 21 Dezember 2018, 18:09:20
Hast Du irgendwo in 99_testUtils ein use Data::Dumper
?
Ich lade das nicht manuell.
Was ich nicht verstehe, wenn der Dumper nicht gefunden wird, warum funktioniert dann parseParam nicht? Bzw. Dumper gibt mir ja teilweise die Ausgabevariablen von parseParams, $V1 und $V2 aus, allerdings falsch befüllt.
Jetz gehts ja erstmal. Aber kann ich irgendwie den Verlauf von Perlprogrammen "mitverfolgen"? Und gibt es einen Shellbefehl, mit dem ich einfach alle Dateien eines Verzeichnises nach einem String durchsuchen kann?
Dann würde ich vesuchen nachzuverfolgen, wo sich use Data::Dumper befindet und wann es geladen wird usw..
Aber alles frühestens wieder, wenn ich wieder Zeit und Zugriff auf meine Installation habe - also Anfang/Mitte Januar.
ZitatUnd gibt es einen Shellbefehl, mit dem ich einfach alle Dateien eines Verzeichnises nach einem String durchsuchen kann?
Moin und frohe Weihnachten.
Nimm das gute alte
grep.
grep -n Dumper /opt/fhem/FHEM/*
Gruß
Hans