Autor Thema: eine etwas spezielle Anforderung und dessen Lösung  (Gelesen 650 mal)

Offline CoolTux

  • Moderator
  • Hero Member
  • ***
  • Beiträge: 28066
eine etwas spezielle Anforderung und dessen Lösung
« 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;
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/
Mein Dokuwiki:
https://www.cooltux.net

Offline betateilchen

  • Developer
  • Hero Member
  • ****
  • Beiträge: 18513
Antw:eine etwas spezielle Anforderung und dessen Lösung
« Antwort #1 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;
}
-----------------------
Möchte man beruflich "etwas mit Menschen" machen, ohne etwas mit deren Dummheit zu tun haben zu müssen,
bleibt eigentlich nur der Beruf des Bestatters übrig.
-----------------------
Lesen gefährdet die Unwissenheit!

Offline CoolTux

  • Moderator
  • Hero Member
  • ***
  • Beiträge: 28066
Antw:eine etwas spezielle Anforderung und dessen Lösung
« Antwort #2 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
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/
Mein Dokuwiki:
https://www.cooltux.net

Offline betateilchen

  • Developer
  • Hero Member
  • ****
  • Beiträge: 18513
Antw:eine etwas spezielle Anforderung und dessen Lösung
« Antwort #3 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?  ;)
-----------------------
Möchte man beruflich "etwas mit Menschen" machen, ohne etwas mit deren Dummheit zu tun haben zu müssen,
bleibt eigentlich nur der Beruf des Bestatters übrig.
-----------------------
Lesen gefährdet die Unwissenheit!

Offline CoolTux

  • Moderator
  • Hero Member
  • ***
  • Beiträge: 28066
Antw:eine etwas spezielle Anforderung und dessen Lösung
« Antwort #4 am: 22 November 2022, 05:01:45 »
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/
Mein Dokuwiki:
https://www.cooltux.net

Offline CoolTux

  • Moderator
  • Hero Member
  • ***
  • Beiträge: 28066
Antw:eine etwas spezielle Anforderung und dessen Lösung
« Antwort #5 am: 22 November 2022, 05:13:26 »
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/
Mein Dokuwiki:
https://www.cooltux.net

Offline TomLee

  • Tester
  • Hero Member
  • ****
  • Beiträge: 4465
  • ... wer sät, der erntet ...
Antw:eine etwas spezielle Anforderung und dessen Lösung
« Antwort #6 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;
}
« Letzte Änderung: 24 November 2022, 15:22:34 von TomLee »

Offline TomLee

  • Tester
  • Hero Member
  • ****
  • Beiträge: 4465
  • ... wer sät, der erntet ...
Antw:eine etwas spezielle Anforderung und dessen Lösung
« Antwort #7 am: 23 November 2022, 22:21:31 »
Zitat
die etwas länger ist :[/quote]

Korrektur, wenn man nur die benötigte Anzahl Zeichen betrachtet ist die Variante kürzer.
« Letzte Änderung: 24 November 2022, 15:21:44 von TomLee »

Offline betateilchen

  • Developer
  • Hero Member
  • ****
  • Beiträge: 18513
Antw:eine etwas spezielle Anforderung und dessen Lösung
« Antwort #8 am: 23 November 2022, 22:49:38 »
gegen Corona kann man sich wenigstens impfen...
-----------------------
Möchte man beruflich "etwas mit Menschen" machen, ohne etwas mit deren Dummheit zu tun haben zu müssen,
bleibt eigentlich nur der Beruf des Bestatters übrig.
-----------------------
Lesen gefährdet die Unwissenheit!

Offline TomLee

  • Tester
  • Hero Member
  • ****
  • Beiträge: 4465
  • ... wer sät, der erntet ...
Antw:eine etwas spezielle Anforderung und dessen Lösung
« Antwort #9 am: 23 November 2022, 22:59:14 »
du hast angefangen zu säen, ich kann nur sagen das ich dankbar dafür bin ...
« Letzte Änderung: 24 November 2022, 15:22:55 von TomLee »