Autor Thema: Reading enthält mehrere Werte  (Gelesen 119 mal)

Offline Pi_01

  • Jr. Member
  • **
  • Beiträge: 69
Reading enthält mehrere Werte
« am: 02 August 2020, 14:25:02 »
Hallo,
ich habe ein Reading im folgenden Format vorliegen:

2020-08-02 14:14:43|20544
Wie kann ich innerhalb der Datei 99_myUtils.pm auf den ersten ("2020-08-02 14:14:43") und zweiten ("20544") Wert zugreifen?

Mit dem PERL-Code

my $var = ReadingsVal("meineRep","SqlResultRow_2","nothing");
erhalte ich den vollständigen "String"

2020-08-02 14:14:43|20544
zurück.

Ich dachte mit

@array=split(/|/,$var);
könnte ich die zwei Werte in zwei verschieden Variablen speichern. Das geht aber nicht.

Wo liegt der Fehler?

Offline DS_Starter

  • Developer
  • Hero Member
  • ****
  • Beiträge: 5766
Antw:Reading enthält mehrere Werte
« Antwort #1 am: 02 August 2020, 14:33:53 »
Du musst den senkrechten Strich escapen damit er im Regex als normales Zeichen gewertet wird:

@array=split(/\|/,$var);
ESXi 6.5 @NUC6i5SYH mit FHEM auf Debian 10, DbLog/DbRep mit MariaDB auf Synology 415+
Maintainer: SSCam, SSChatBot, SSCal, DbLog/DbRep, Log2Syslog, SMAPortal, Watches, Dashboard
Kaffeekasse: https://www.paypal.me/HMaaz
Contrib: https://svn.fhem.de/trac/browser/trunk/fhem/contrib/DS_Starter

Offline Pi_01

  • Jr. Member
  • **
  • Beiträge: 69
Antw:Reading enthält mehrere Werte
« Antwort #2 am: 02 August 2020, 15:57:46 »
oh mann, dass das |-Zeichen auch escapt werden muss, daran hätte ich nie gedacht.
Danke DS_Starter.

Abschließend noch eine Frage (ich möchte deswegen nicht extra einen neuen Thread aufmachen):

Wie kann man in PERL mit Datum arbeiten?
Ich habe das Format 2020-08-02 14:14:43 vorliegen und möchte prüfen: "nach 12 Uhr und vor 14 Uhr"

Offline DS_Starter

  • Developer
  • Hero Member
  • ****
  • Beiträge: 5766
Antw:Reading enthält mehrere Werte
« Antwort #3 am: 02 August 2020, 16:39:02 »
Zitat
oh mann, dass das |-Zeichen auch escapt werden muss, daran hätte ich nie gedacht.
Ja, sonst wird | in einem Regex als "oder" Bedingung verwendet.

Zitat
Ich habe das Format 2020-08-02 14:14:43 vorliegen und möchte prüfen: "nach 12 Uhr und vor 14 Uhr"
Es gibt wie immer viele Möglichkeiten. Hier eine auf die Schnelle ohne Anspruch auf Fehlerfreiheit.
Nehmen wir an du hast:

 $dt = "2020-08-02 14:14:43";

Dann kannst du anwenden:

my ($h) = $dt =~ /\s([0-9]*?):/;
In $h steht in dem Beispiel dann "14". Damit kannst du weitermachen.
Alternativ kannst du natürlich wieder splitten oder auch mit substr arbeiten.

Grüße,
Heiko
« Letzte Änderung: 02 August 2020, 17:24:36 von DS_Starter »
ESXi 6.5 @NUC6i5SYH mit FHEM auf Debian 10, DbLog/DbRep mit MariaDB auf Synology 415+
Maintainer: SSCam, SSChatBot, SSCal, DbLog/DbRep, Log2Syslog, SMAPortal, Watches, Dashboard
Kaffeekasse: https://www.paypal.me/HMaaz
Contrib: https://svn.fhem.de/trac/browser/trunk/fhem/contrib/DS_Starter