[Perl] 99_myUtils.pm Array mit FHEM Reading befüllen

Begonnen von Jorge3711, 15 Juni 2017, 20:19:07

Vorheriges Thema - Nächstes Thema

Jorge3711

Hallo zusammen,

als Perl Fingerübung (bin Perl-Anfänger) versuche ich aus einem Reading bestimmte Informationen herauszubekommen um sie anschließend weiterverarbeiten zu können.

Das Reading sieht so aus (es geht um das TelegramBot Contacts Reading):


123456789:Name1:@Name1 123456789:Name2:@Name2 123456789:Name3:@Name3


Der Reading Inhalt hat drei durch Leerzeichen getrennte Blöcke. Die Blöcke ihrerseits sind durch Doppelpunkte wieder in 3 Unterblöcke unterteilt. Ich versuche den 3. Unterblock ("@Name[1,2,3]") zu extrahieren.

Dazu habe ich mir folgenden Code geschrieben, welcher in meiner IDE funktioniert, wenn ich den Code mit den RAW Daten füttere:


use strict;
use warnings;
use POSIX;

#my @contacts = qw'(ReadingsVal("TelegramBot", "Contacts", "nA"))';
my @contacts = qw"123456789:Name1:@Name1 123456789:Name2:@Name2 123456789:Name3:@Name3";
my $regex = qr/[@]\w+$/p;

foreach my $item (@contacts) {
if ($item =~ /$regex/g){
my $contact = ${^MATCH};
print "$contact","\n";
}
}

Output:
[Running] perl "c:\Users\cle\Projekte\git\FHEM\temp-sgrhdptuhz.perl"
@Name1
@Name2
@Name3



Um das Leerzeichen getrennte Reading in das Array @contacts zu bekommen, nutze ich den Perl-Operator (richtige Bezeichnung?) "qw", was grundsätzlich funktioniert.
Im Kommentar im Code seht ihr schon meinen Versuch es in der FHEM 99_myUtils.pm zu lösen, allerdings funktioniert das nicht. Die sub sieht aktuell so aus:


sub telegramContact() {
#my @contacts = qw'123456789:Name1:@Name1 123456789:Name2:@Name2 123456789:Name3:@Name3';
my @contacts = qw'(ReadingsVal("TelegramBot", "Contacts", "nA"))';
Debug("Contacts: @contacts");
my $regex = qr/[@]\w+$/p;
Debug("$regex");
foreach my $item (@contacts) {
if ($item =~ /$regex/g){
my $contact = ${^MATCH};
Log3("TelegramBot", 3, $contact);
}
}
}


Die DEBUG Ausgaben im LOG sehen so aus:


2017.06.15 20:16:31 1: DEBUG>Contacts: (ReadingsVal("TelegramBot", "Contacts", "nA"))
2017.06.15 20:16:31 1: DEBUG>(?^p:[@]\w+$)


Die Frage ist nun also, wie bekomme ich den Output von "ReadingsVal("TelegramBot", "Contacts", "nA")" an "qw" übergeben?

Update:
Ich hatte auch schon versucht das Reading zuerst in eine Variable zu schreiben und diese an "qw" zu übergeben, aber "qw" kann nicht mit Variablen umgehen. In Perl6 gibt es deshalb "qqw", das eine Variable verarbeiten kann.

Denkanstoß willkommen!

Viele Grüße
Jorge

CoolTux


my @contacts = split(' ',ReadingsVal("TelegramBot", "Contacts", "nA"));


Dann hast du alles im Array und Zar an den Leerzeichen getrennt.
Du musst nicht wissen wie es geht! Du musst nur wissen wo es steht, wie es geht.
Support me to buy new test hardware for development: https://www.paypal.com/paypalme/MOldenburg
My FHEM Git: https://git.cooltux.net/FHEM/
Das TuxNet Wiki:
https://www.cooltux.net

igami

Zitat von: Jorge3711 am 15 Juni 2017, 20:19:07
Die Frage ist nun also, wie bekomme ich den Output von "ReadingsVal("TelegramBot", "Contacts", "nA")" an "qw" übergeben?
Zwar zu Langsam, aber split ist dein Freund.


sub telegramContact() {
my $contacts = '123456789:Name1:@Name1 123456789:Name2:@Name2 123456789:Name3:@Name3';
my @contacts = split(" ", $contacts);
Debug("Contacts: @contacts");
foreach my $contact (@contacts) {
my ($Id, $user, $peer) = split(":", $contact);

}
}
Pi3 mit fhem.cfg + DbLog/logProxy
Komm vorbei zum FHEM Treffen im Kreis Gütersloh! Das nächste Mal im April 2020.

MAINTAINER: archetype, LuftdatenInfo, monitoring, msgDialog, Nmap, powerMap
ToDo: AVScene, FluxLED

Jorge3711

Das war ja einfach :) Und ich war so stolz auf meine gefundene qw Lösung ;)

Danke an Euch beide!

Thorsten Pferdekaemper

Hi,
die q-Operatoren werden zur Compilezeit ausgeführt und nicht zur Laufzeit. Das ist in etwa so wie die Compiler-Direktiven in C oder C++.  In anderen Worten: Das was dem qw als Parameter vorgegeben wird, wird nicht ausgewertet, sondern einfach so genommen, wie es da steht.

qw'(ReadingsVal("TelegramBot", "Contacts", "nA"))'

...ergibt also ein Array mit den folgenden drei Einträgen:
    (ReadingsVal("TelegramBot",
    "Contacts",
    "nA"))
Gruß,
   Thorsten
FUIP