FHEM Forum

FHEM => Automatisierung => Thema gestartet von: Jorge3711 am 15 Juni 2017, 20:19:07

Titel: [Perl] 99_myUtils.pm Array mit FHEM Reading befüllen
Beitrag von: Jorge3711 am 15 Juni 2017, 20:19:07
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
Titel: Antw:[Perl] 99_myUtils.pm Array mit FHEM Reading befüllen
Beitrag von: CoolTux am 15 Juni 2017, 20:24:35

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


Dann hast du alles im Array und Zar an den Leerzeichen getrennt.
Titel: Antw:[Perl] 99_myUtils.pm Array mit FHEM Reading befüllen
Beitrag von: igami am 15 Juni 2017, 20:30:16
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);

}
}
Titel: Antw:[Perl] 99_myUtils.pm Array mit FHEM Reading befüllen
Beitrag von: Jorge3711 am 15 Juni 2017, 20:31:07
Das war ja einfach :) Und ich war so stolz auf meine gefundene qw Lösung ;)

Danke an Euch beide!
Titel: Antw:[Perl] 99_myUtils.pm Array mit FHEM Reading befüllen
Beitrag von: Thorsten Pferdekaemper am 15 Juni 2017, 21:00:08
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