FHEM Forum

FHEM - Entwicklung => FHEM Development => Perl Ecke => Thema gestartet von: CoolTux am 21 November 2022, 22:07:06

Titel: eine etwas spezielle Anforderung und dessen Lösung
Beitrag von: CoolTux am 21 November 2022, 22:07:06
Hallo,

Ich hatte gestern Abend eine etwas spezielle Anforderung zu lösen.

Gegeben sind 2 Strings mit folgendem Aufbau.

String1: alerts,minutely,hourly,daily
String2: alerts,daily

Bei String1 handelt es sich um ein Options String welcher einem URL Aufruf mitgegeben wird und ein exclude Ausdrückt. Es soll in der Antwort also nichts bezüglich Alert,minutely,hourly oder daily mitgeben werden.

String2 hingegen besagt was mitgegeben werden soll. Es ist also eine negierte Anforderung von String1. Bedeutet in Grunde, das was in String2 steht darf nicht in String1 stehen damit der URL Aufruf so erfolgt das die Antwort die Dinge enthält welche ich in String2 angebenen habe.

Da zu muss also im Grunde das was in String2 steht aus String1 entfernt werden.
Ich habe hierzu als erstes die Werte aus String1 und String2 in jeweils separate Arrays gepackt um dann das was in Array2 steht also Daten aus String2 aus dem Array1 zu entfernen. Danach habe ich aus dem daraus entstandenen Datensatz einen neuen String gebaut welcher nun die Werte Komma separiert enthält welche im String2 standen und deswegen nicht mehr im String1 stehen durften.



#!/usr/bin/perl

package main;

use strict;
use warnings;

my @exclude   = qw/alerts minutely hourly daily/;                 # Beispielhaft für String1
my $forcast = 'daily';           # Beispielhaft für einen Teil von String2
my $alerts  = 0;                   # Beispielhaft für einen Teil von String2 vobei der Eigentliche Inhalt des String tatsächlich erst etwas Später kommt. Hat $alerts den Wert eins soll der String ",alerts" verwendet werden ist der Wert 0 soll gar nichts im String stehen.

my @forecast  = split(',',$forcast);
my @alerts     = split(',',($alerts ? ',alerts' : ''));
my %exclude =();

@exclude{@exclude} = @exclude;
delete @exclude{@forecast};
delete @exclude{@alerts};

print join(',',keys %exclude) . "\n";


exit 0;
Titel: Antw:eine etwas spezielle Anforderung und dessen Lösung
Beitrag von: betateilchen am 21 November 2022, 22:41:39
das geht aber auch einfacher...


sub test {
  my @exclude    = qw/alerts minutely hourly daily/;
  my @forcast    = qw/daily/;
  my %in_forcast = map {$_ => 1} @forcast;
  my @diff       = grep {not $in_forcast{$_}} @exclude;
  return Dumper \@diff;
}
Titel: Antw:eine etwas spezielle Anforderung und dessen Lösung
Beitrag von: CoolTux am 21 November 2022, 22:57:34
Vielen Dank für Deine Lösung, schaue ich mir sehr gerne morgen genauer an.
Sieht auf jeden Fall in der Tat eleganter aus. Ich hatte auch erst eine Lösung mit map versucht bin da aber leider gescheitert.

Grüße
Titel: Antw:eine etwas spezielle Anforderung und dessen Lösung
Beitrag von: betateilchen am 21 November 2022, 22:58:27
Geht natürlich am Ende auch mit einem join als Rückgabe statt mit Dumper.

Und sollte es nicht eigentlich forecast heißen?  ;)
Titel: Antw:eine etwas spezielle Anforderung und dessen Lösung
Beitrag von: CoolTux am 22 November 2022, 05:01:45
Zitat von: betateilchen am 21 November 2022, 22:58:27
Geht natürlich am Ende auch mit einem join als Rückgabe statt mit Dumper.

Und sollte es nicht eigentlich forecast heißen?  ;)

In der Tat sollte es forecast heißen. Danke Dir. Muss ich noch ändern  :D
Titel: Antw:eine etwas spezielle Anforderung und dessen Lösung
Beitrag von: CoolTux am 22 November 2022, 05:13:26
Zitat von: betateilchen am 21 November 2022, 22:41:39
das geht aber auch einfacher...


sub test {
  my @exclude    = qw/alerts minutely hourly daily/;
  my @forcast    = qw/daily/;
  my %in_forcast = map {$_ => 1} @forcast;
  my @diff       = grep {not $in_forcast{$_}} @exclude;
  return Dumper \@diff;
}


Klappt auch sehr gut.
Titel: Antw:eine etwas spezielle Anforderung und dessen Lösung
Beitrag von: TomLee am 23 November 2022, 19:09:26
https://forum.fhem.de/index.php/topic,130448.msg1246971.html#msg1246971

Keine Ahnung ob jetzt besser, gleichwertig oder weniger geeignet, oder ich was übersehe, es hat mich nur beschäftigt, hab noch diese Möglichkeit "gefunden", die etwas länger ist :

sub test {
my @exclude = qw/alerts minutely hourly daily/;
my @forecast  = qw/daily minutely/;
my %files;
@files{ @exclude } = ();   # All files are the keys.
delete @files{ @forecast }; # Remove the links.
my @diff = keys %files;
return Dumper \@diff;
}
Titel: Antw:eine etwas spezielle Anforderung und dessen Lösung
Beitrag von: TomLee am 23 November 2022, 22:21:31
Zitatdie etwas länger ist :[/quote]

Korrektur, wenn man nur die benötigte Anzahl Zeichen betrachtet ist die Variante kürzer.
Titel: Antw:eine etwas spezielle Anforderung und dessen Lösung
Beitrag von: betateilchen am 23 November 2022, 22:49:38
gegen Corona kann man sich wenigstens impfen...
Titel: Antw:eine etwas spezielle Anforderung und dessen Lösung
Beitrag von: TomLee am 23 November 2022, 22:59:14
du hast angefangen zu säen, ich kann nur sagen das ich dankbar dafür bin ...