eine etwas spezielle Anforderung und dessen Lösung

Begonnen von CoolTux, 21 November 2022, 22:07:06

Vorheriges Thema - Nächstes Thema

CoolTux

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;
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

betateilchen

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;
}
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

CoolTux

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
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

betateilchen

Geht natürlich am Ende auch mit einem join als Rückgabe statt mit Dumper.

Und sollte es nicht eigentlich forecast heißen?  ;)
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

CoolTux

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
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

CoolTux

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.
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

TomLee

#6
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;
}

TomLee

#7
Zitatdie etwas länger ist :[/quote]

Korrektur, wenn man nur die benötigte Anzahl Zeichen betrachtet ist die Variante kürzer.

betateilchen

-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

TomLee

#9
du hast angefangen zu säen, ich kann nur sagen das ich dankbar dafür bin ...