Hallo zusammen,
ich mache meine ersten Schritte mit Perl und habe für einen ersten Test folgende Funktion in 99_myUtils.pm erstellt:
sub tfkTest2($) {
my ($recipient) = @_;
my @tfk=devspec2array("subType=threeStateSensor:FILTER=NAME=sec.tfk..*"); # Welche "echten" Türfensterkontakte gibt es überhaupt
my @windowOpen = undef;
my @lastStanding = undef;
# Anzahl offener Fenster ermitteln
#
foreach(@tfk) {
my $state = ReadingsVal($_,"state","nA");
my $dev = AttrVal($_,"alias", "nA");
if ($state eq "open") {
push(@windowOpen,$dev);
}
}
my $msg = "Es sind $#windowOpen Fenster offen! Bitte @windowOpen schliessen.";
#Debug($msg);
Log3("tfkAlert", 3, $msg);
fhem("set TelegramBot msg $recipient $msg");
}
Meine Funktion tfkTest2 erwartet als Parameter einen Telegram Empfänger, soweit so gut. Gibt man den reinen Telegrambenutzer an (ID, oder Benutzername), funktioniert es zwar grundsätzlich, in der Telegram Nachricht ist aber die angegebene ID/Benutzername vorangestellt:
Zitat
Benutzer Es sind 2 Fenster offen! Bitte Schlafzimmerfenster links Terrassentür schliessen.
Das ist unschön und lässt sich beheben, indem der Telegram Empfänger mit @Benutzer adressiert wird (statt mit "Benutzer"), so wie es das TelegramBot Modul auch vorsieht. Als Konsequenz habe ich dann folgendes in meiner Variable $recipient stehen:
$recipient = @Benutzer;
Dieses Konstrukt führt jetzt zu Fehlern, da Perl @Benutzer natürlich wieder als Variable interpretiert, die a) nicht existiert bzw. b) leer/undef ist:
Global symbol "@Benutzer" requires explicit package name at (eval 44761) line 1.
Soweit meine Problembeschreibung, ich hoffe verständlich.
Meine Idee, als völliger Perl-Anfänger, wäre jetzt gewesen, das @-Zeichen im Variableninhalt mittels \ zu maskieren, also quasi sowas in der Art:
$recipient = \@Benutzer;
Ich habe aber keine Idee, wie ich den Inhalt der Variable @recipient entsprechen anpassen/ändern kann, oder wie der String "@Benutzer" direkt als String, und nicht als Variableninhalt in die Variable $recipient gespeichert werden kann.
Denkanstöße willkommen.
Danke und Gruß
Jorge
Oder das @ mit \@ escapen.
Gruß
Dan
Zitat von: viegener am 02 Juni 2017, 22:00:48
Wobei Du natürlich auch in Deiner Routine so etwas wie
fhem('set TelegramBot msg @'.$recipient." ".$msg);
machen kannst, und dann den Empfänger ohne @ übergeben
OK, das funktioniert, und ich glaube auch (grob) zu verstehen, was die Zeile macht. Danke!
Kurze Erklärung: es gibt in Perl einen Unterschied zwischen " und ' beim Aufbau von Strings
Innerhalb eines "-Strings werden auch eprl Variablen also $abc oder @def etc ausgewertet. Also das $ und ähnliche Zeichen werden von perl interpretiert
Innerhalb eines '-Strings passiert das nicht
Zitat von: viegener am 05 Juni 2017, 14:07:00
Kurze Erklärung: es gibt in Perl einen Unterschied zwischen " und ' beim Aufbau von Strings
Innerhalb eines "-Strings werden auch eprl Variablen also $abc oder @def etc ausgewertet. Also das $ und ähnliche Zeichen werden von perl interpretiert
Innerhalb eines '-Strings passiert das nicht
Das war mir tatsächlich schon bekannt (u.a. Powershell [emoji846]). Und mit den Punkten werden Strings zusammengesetzt/aneinander gereiht...
Gesendet von iPhone mit Tapatalk