[gelöst] Regex Frage mit multiple matches

Begonnen von Sirel, 15 Februar 2021, 20:18:34

Vorheriges Thema - Nächstes Thema

Sirel

Hallo zusammen,

ich habe es nun wie folgt gelöst. Schön schlank und performant m. E. n.

Ein DOIF triggert die Routine, sofern am Folgetag ein Event ansteht:


([20:00] and defined fhem ('get muellabfuhr_ical events format:custom="$S" limit:when=tomorrow')) ({Muellabfuhr}) DOELSE


Die Rutine ist wie folgt:


sub Muellabfuhr() {


# Holt die entsprechenden Kalendereinträge. Am Zeilenumbruch der Response wird getrennt und in das Array geschrieben.

my @e = split("\n",fhem 'get muellabfuhr_ical events format:custom="$S" limit:when=tomorrow');
my @t;

# das Array aus dem Kalender wird durchlaufen. Der Teil des Wortes, auf welches die Regex matched, befindet sich dann in der Variablen $1 und wird dann in das Array gepushed wird.

  for (@e) {
    push @t,$1 if $_=~/\S+.(\S+tonne)/;
  }

# Da Doubletten auftreten können, werden sie rausgefiltert. Dazu wird eine Hash Variable wird angelegt. Jedem Wert aus dem Array t wird als Pair der Wert 1 zugeordnet. Der Wert ist völlig ega.
# Am Ende werden die Hashes in das Array tonnen geschrieben

my %all= ();
@all{@t}= 1;
my @tonnen_1 = (keys %all);

# Das Array wird über ein join in einen Variable gejoined. Dabei werden Zeileneinbrüche eingefügt.

my $tonne = join("\n",@tonnen_1);

#Versand per Telegram

{fhem ("set xxxx  send Morgen müssen folgende Tonnen rausgestellt werden \\n$tonne")};

}

1;


Finde die Lösung für mich optimal, vielleicht hilft sie anderen ebenfalls.

Besten Dank an @DeeSPe und @Otto123 für die Hilfe und den wertvollen Input.

Max

DeeSPe

Mach doch gleich so, dann sind erst gar keine Dubletten im Array:
  for (@e) {
    push @t,$1 if $_=~/\S+.(\S+tonne)/ && !grep(/^$1$/,@t);
  }


Schön dass Du nun eine Lösung für Dich hast.

Gruß
Dan
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