Perl Array: Zuweisung eines Strings der dummerweise mit einem @ beginnt

Begonnen von Jorge3711, 02 Juni 2017, 21:34:48

Vorheriges Thema - Nächstes Thema

Jorge3711

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

viegener

Kein Support über PM - Anfragen gerne im Forum - Damit auch andere profitieren und helfen können

viegener

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
Kein Support über PM - Anfragen gerne im Forum - Damit auch andere profitieren und helfen können

DeeSPe

MAINTAINER: 22_HOMEMODE, 98_Hyperion, 98_FileLogConvert, 98_serviced

Als kleine Unterstützung für meine Programmierungen könnt ihr mir gerne einen Kaffee spendieren: https://buymeacoff.ee/DeeSPe

Jorge3711

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!

viegener

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
Kein Support über PM - Anfragen gerne im Forum - Damit auch andere profitieren und helfen können

Jorge3711

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