eigene Perl-Routine mit Parameterübergabe

Begonnen von OliWee, 21 Oktober 2016, 17:40:48

Vorheriges Thema - Nächstes Thema

OliWee

Hi!
Ich spiele grade mit dem TelegramBot rum. Dabei bin ich als Perl-Noob auf ein Problem gestoßen mit dem ich nicht zurecht komme:

Ich habe eine Routine in 99_myUtils.pm erstellt, die aufgerufen wird, wenn eine Nachricht über Telegram reinkommt. Das Ganze funktioniert auch schon ganz prima, wenn ich die Rückmeldung an den Telegram-Defaultpeer schicke.

Jetzt habe ich meine Routine erweitert und möchte ihr den Sender der Nachricht übergeben. Das funktioniert aber nicht. Ich bekomme beim Speichern von 99_myUtils folgende Fehlermeldung:


Did not find leading dereferencer, detected at offset 2574syntax error at ./FHEM/99_myUtils.pm line 29, near ")
{" syntax error at ./FHEM/99_myUtils.pm line 33, near "} else" Global symbol "@cmdWords" requires explicit
package name at ./FHEM/99_myUtils.pm line 34. Global symbol "$Sender" requires explicit package
name at ./FHEM/99_myUtils.pm line 37. syntax error at ./FHEM/99_myUtils.pm line 38, near "}"
Global symbol "$Sender" requires explicit package name at ./FHEM/99_myUtils.pm line 41. syntax error
at ./FHEM/99_myUtils.pm line 42, near "}" Global symbol "$Sender" requires explicit package name at
./FHEM/99_myUtils.pm line 45. syntax error at ./FHEM/99_myUtils.pm line 46, near "}" Global symbol
"$Sender" requires explicit package name at ./FHEM/99_myUtils.pm line 49. syntax error at
./FHEM/99_myUtils.pm line 50, near "}" ./FHEM/99_myUtils.pm has too many errors.


Offensichtlich mache ich etwas mit der Parameterübergabe falsch, ich habe aber keine Ahnung was...
Meine Routine sah bisher so aus, und so funktioniert es auch (Auszug, nur die ersten paar Zeilen):

sub cmdDobby
{
  my $cmd = ReadingsVal("Dobby", "msgText", "Fehler");
  my $cmdText = lc $cmd;
  my $rcvStatus = ReadingsVal("EG.Wohnzimmer.Receiver", "power", "Fehler");

  my @cmdWords=split m/ /, $cmdText;

  switch ($cmdWords[0]) {
    case 'radio' {
      if (Value("EG.Wohnzimmer.Receiver") eq 'absent') {
         fhem("set Dobby message Der Receiver ist nicht erreichbar");
      } else {
   ...


Und so sieht es jetzt aus, mit Parameterübergabe:

sub cmdDobby($)
{
  my ($Sender) = @_;
  my $cmd = ReadingsVal("Dobby", "msgText", "Fehler");
  my $cmdText = lc $cmd;
  my $rcvStatus = ReadingsVal("EG.Wohnzimmer.Receiver", "power", "Fehler");

  my @cmdWords=split m/ /, $cmdText;

  switch ($cmdWords[0]) {
    case 'radio' {
      if (Value("EG.Wohnzimmer.Receiver") eq 'absent') {
         fhem("set Dobby message @" . $Sender . " Der Receiver ist nicht erreichbar");
      } else {
   ...


Die Routine fängt übrigens in Zeile 19 an...

Für ein kleines Bisschen Erleuchtung wäre ich dankbar...  ;D

Gruß
Oli

OliWee

#1
Also, das verstehe ich jetzt nicht...

Ich bin jetzt wieder von der ursprünglichen, funktionierenden Routine ausgegangen. Das einzige, was ich jetzt geändert habe, ist, dass ich aus
sub cmdDobby

sub cmdDobby($)

gemacht habe. Und dann kommt der Fehler...

Wie muss ich denn die Zeilennummern in der Fehlermeldung interpretieren? Ist die erste Zeile der Datei die Zeile 0 oder Zeile 1? Werden Kommentarzeilen und/oder Leerzeilen mitgezählt?

EDIT:
sub cmdDobby($$)

Lässt sich fehlerfrei speichern.
Aber ich möchte doch nur einen Parameter übergeben, und nicht zwei...

jojoja

Hallo Oli,

bei der Parameterübergabe kann ich dir leider nicht weiterhelfen, jedoch bei den Zeilen:
attr TYPE=FHEMWEB JavaScripts codemirror/fhem_codemirror.js
Das aktiviert den integrierten Editor, bei dem die Zeilenzahl angezeigt wird, die stimmt mit den Fehlerangaben überein: http://www.fhemwiki.de/wiki/Konfiguration#Integrierter_Editor

Gruß Johannes
FHEM 6.0 @ IntelNUC6CAYH;  Unifi USG, Switch, AP AC Pro; HM-MOD-UART;  Sonos Play 1 & 3, One, Beam; Philips Hue

OliWee

Guter Tipp, danke!

Ich habe jetzt mein Problem zwar gelöst, indem ich die Info, die ich benötige direkt aus dem Reading des TelegramBot auslese, trotzdem würde mich das mit der Parameterübergabe doch interessieren...

Gruß
Oli

amenomade

Pi 3B, Alexa, CUL868+Selbstbau 1/2λ-Dipol-Antenne, USB Optolink / Vitotronic, Debmatic und HM / HmIP Komponenten, Rademacher Duofern Jalousien, Fritz!Dect Thermostaten, Proteus