FHEM Forum

FHEM => Anfängerfragen => Thema gestartet von: derHeimwerker am 15 Juni 2017, 09:52:49

Titel: Perl: Zeichenketten beschneden / split
Beitrag von: derHeimwerker am 15 Juni 2017, 09:52:49
Hallo,

ich übergeben einen Device-Namen an eine (sub-)Routine. Name: Schalter.Wohnzimmer.
Mein Code sieht so aus :

my $dev=shift(@_);
my ($art,$sensor_ort)=split(/\./,$dev);

Das funktioniert auch wunderbar. Allerdings brauche ich die variable $art nicht. Ich möchte nur in der Variablen $sensor das "Wohnzimmer" haben.

Wie bekomme ich den ersten Teil bis zum .(Punkt) weg ?
Titel: Antw:Perl: Zeichenketten beschneden / split
Beitrag von: knopf_piano am 15 Juni 2017, 09:59:57
Kannst $art auch $trash nennen und einfach nicht verwenden. Split muß ja die teile variablen zuweisen. Wenn du split einem @arr zuweist steht dein ort in $arr[1]. Ist prinzipiell das gleiche...

my @arr=split(/\./,$dev);

Gesendet von meinem SM-J510FN mit Tapatalk

Titel: Antw:Perl: Zeichenketten beschneden / split
Beitrag von: igami am 15 Juni 2017, 10:10:21
my $dev=shift(@_);
ist rigendwie doppelt gemoppelt :D

Du kannst auch bei split nur einen bestimmten Teil zurück geben lassen.

my $sensor_ort = (split(/\./, shift, 2))[1];

Die 2 sorgt noch dafür, dass der String auch nur in zwei Teile aufgeteilt wird. die ()[1] gibt das zweite Element aus dem array des split zurück.
Titel: Antw:Perl: Zeichenketten beschneden / split
Beitrag von: derHeimwerker am 15 Juni 2017, 10:18:42
Zitat von: igami am 15 Juni 2017, 10:10:21
my $dev=shift(@_);
ist rigendwie doppelt gemoppelt :D

Dann habe ich es DOCH richtig verstanden :-) (@_) bedeutet doch, dass die Argumente nacheinander übergeben werden ? Es reicht demnach auch my $dev = @_ ?

Zitat von: igami am 15 Juni 2017, 10:10:21
Du kannst auch bei split nur einen bestimmten Teil zurück geben lassen.

my $sensor_ort = (split(/\./, shift, 2))[1];

Die 2 sorgt noch dafür, dass der String auch nur in zwei Teile aufgeteilt wird. die ()[1] gibt das zweite Element aus dem array des split zurück.

Super ! Vielen Dank !
Titel: Antw:Perl: Zeichenketten beschneden / split
Beitrag von: knopf_piano am 15 Juni 2017, 10:29:43
Fein. Viele Wege gehen nach Rom[emoji106]

Gesendet von meinem SM-J510FN mit Tapatalk

Titel: Antw:Perl: Zeichenketten beschneden / split
Beitrag von: igami am 15 Juni 2017, 10:36:57
Zitat von: derHeimwerker am 15 Juni 2017, 10:18:42
Dann habe ich es DOCH richtig verstanden :-) (@_) bedeutet doch, dass die Argumente nacheinander übergeben werden ? Es reicht demnach auch my $dev = @_ ?

@_ sind alle Elemente die übergeben werden und mit shift kann man das erste Element aus einem Array rausziehen. Bentzt du shift einfach nur so, wird automatisch @_ genommen. Bei nur einem Parameter geht als sowohl @_ wie auch shift. Bei mehreren ist @_ meist einfacher.
Beispiel:

sub highlander($) {
  my $param = shift;
}

sub my cyberman($$$) {
  my ($one, $two, $three) = @_;
}
Titel: Antw:Perl: Zeichenketten beschneden / split
Beitrag von: Markus Bloch am 15 Juni 2017, 10:47:52
Du kannst auch die ursprüngliche Variante verwenden und einfach keine Variable erzeugen:
my $dev=shift(@_);
my (undef,$sensor_ort)=split(/\./,$dev);

Titel: Antw:Perl: Zeichenketten beschneden / split
Beitrag von: hummeruli am 07 Juli 2017, 14:15:22
Stehe mal wieder auf meiner Leitung.

ich habe ein Gerät, das die Readings für eine RGBW auf einem Mysensors Node. Dieser möchte jedoch die einzelnen Readings getrennt haben

Internals:
   CFGFN      ./FHEM/Mysensors.cfg
   DEF        107
   IODev      Homenode_gw
   I_SKETCH_NAME RGBW
   I_SKETCH_VERSION 2.0
   NAME       Homenode_107
   NR         1153
   STATE      routingtable cleared
   TYPE       MYSENSORS_DEVICE
   ack        1
   protocol   2.1.1
   radioId    107
   repeater   1
   READINGS:
     2017-07-06 21:22:10   SKETCH_NAME     RGBW
     2017-07-06 21:22:10   SKETCH_VERSION  2.0
     2017-07-06 21:22:10   parentId        0
     2017-07-06 23:17:37   percentage3     0
     2017-06-25 15:57:57   percentage5     0
     2017-06-25 15:58:16   percentage6     0
     2017-06-25 15:58:23   percentage9     10
     2017-06-24 16:35:50   power3          0
     2017-06-24 16:35:39   power5          0
     2017-06-24 16:24:31   power6          0
     2017-06-24 16:41:24   power9          2
     2017-06-24 16:42:32   state           routingtable cleared
     2017-06-24 16:07:09   status3         on
     2017-06-24 16:07:17   status5         on
     2017-06-24 16:26:49   status6         on
     2017-06-24 16:07:53   status9         on
   readingMappings:
     1:
       24:
         name       value1
     3:
       17:
         name       power3
       2:
         name       status3
       3:
         name       percentage3
     5:
       17:
         name       power5
       2:
         name       status5
       3:
         name       percentage5
     6:
       17:
         name       power6
       2:
         name       status6
       3:
         name       percentage6
     9:
       17:
         name       power9
       2:
         name       status9
       3:
         name       percentage9
 
   setcommands:
   sets:
     clear
     percentage3 slider,0,1,100
     percentage5 slider,0,1,100
     percentage6 slider,0,1,100
     percentage9 slider,0,1,100
     power3     1
     power5     1
     power6     1
     power9     1
     reboot
     status3    off,on
     status5    off,on
     status6    off,on
     status9    off,on
     time
     value1     1

Attributes:
   IODev      Homenode_gw
   alexaName  Deckenlampe
   alexaRoom  Wohnzimmer
   homebridgeMapping RGB=state,cmd=rgb
   mapReading_percentage3 3 percentage
   mapReading_percentage5 5 percentage
   mapReading_percentage6 6 percentage
   mapReading_percentage9 9 percentage
   mapReading_power3 3 power
   mapReading_power5 5 power
   mapReading_power6 6 power
   mapReading_power9 9 power
   mapReading_status3 3 status
   mapReading_status5 5 status
   mapReading_status6 6 status
   mapReading_status9 9 status
   mapReading_value1 1 value1
   mode       repeater
   requestAck 1
   room       Homenodes
   setReading_percentage3 slider,0,1,100
   setReading_percentage5 slider,0,1,100
   setReading_percentage6 slider,0,1,100
   setReading_percentage9 slider,0,1,100
   setReading_power3 1
   setReading_power5 1
   setReading_power6 1
   setReading_power9 1
   setReading_status3 off,on
   setReading_status5 off,on
   setReading_status6 off,on
   setReading_status9 off,on
   setReading_value1 1
   version    2.1.1


Im RGB_Light bekomme ich leider nur den RGB Wert von 000000 bis FFFFFF

Internals:
   CFGFN      ./FHEM/Mysensors.cfg
   DEF        RGB
   DEVICE     RGB
   NAME       RGB
   NOTIFYDEV  RGB,global
   NR         1166
   NTFY_ORDER 50-RGB
   READING    state
   STATE      on
   TYPE       readingsProxy
   CONTENT:
     RGB        1
   READINGS:
     2017-07-07 13:45:20   hue             0
     2017-07-07 13:45:20   lastCmd         rgb
     2017-07-07 13:45:20   rgb             ff0000
     2017-07-07 13:45:20   state           on
Attributes:
   Light      AllLights
   alias      RGB Licht
   comment    light with the ability to change RGB color
   devStateIcon {Color::devStateIcon("RGB","rgb","rgb","state")}
   group      Beleuchtung_Innen
   room       Homenodes,Light
   setFn      {if( $CMD =~ m/on|off/ ) { $ARGS=$CMD;$CMD = "state" } else {fhem ("setreading $DEVICE state on");} if( $CMD =~ m/hue/ ) {my ($r,$g,$b) = Color::hsv2rgb($ARGS/360,1,1); my $rgb = Color::rgb2hex( $r*255, $g*255, $b*255 ); fhem ("setreading $DEVICE rgb $rgb");} if( $CMD =~ m/rgb/ && $ARGS =~ m/^(..)(..)(..)/ ) {my( $r, $g, $b ) = (hex($1)/255.0, hex($2)/255.0, hex($3)/255.0); my ($h,$s,$v) = Color::rgb2hsv($r,$g,$b); my $hue = int($h*359);  fhem ("setreading $DEVICE hue $hue");} fhem ("setreading $DEVICE $CMD $ARGS");return undef;}
   setList    on:noArg off:noArg rgb:colorpicker,RGB hue:colorpicker,HUE,0,1,359
   userattr   Light Light_map structexclude
   webCmd     hue:rgb:rgb ff0000:rgb 00ff00:rgb 0000ff:rgb ffffff:on:off


Jetzt fehlt mir im Modul der "W" Wert, wobei ich das vermutlich getrennt hinbekommen würde.

Jedoch fehlt mir das Wissen um die "RGB" -> "R" "G" "B" zu splitten.
Weder GIDF.de noch die Sufu hat mir weiter geholfen.

Danke

Uli
Titel: Antw:Perl: Zeichenketten beschneden / split
Beitrag von: dev0 am 07 Juli 2017, 15:54:22
Zitat
Jedoch fehlt mir das Wissen um die "RGB" -> "R" "G" "B" zu splitten.
Perldoc/sprintf hilft Dir auch nicht? Ich wüßte nicht, wie man es besser beschreiben könnte.
Titel: Antw:Perl: Zeichenketten beschneden / split
Beitrag von: hummeruli am 07 Juli 2017, 16:57:50
Zitat von: dev0 am 07 Juli 2017, 15:54:22
Perldoc/sprintf hilft Dir auch nicht? Ich wüßte nicht, wie man es besser beschreiben könnte.

Danke Dir.
Werde mich daran versuchen. Kenne mich nicht aus mit Perl. War mir immer zu Kryptisch.
Habe früher mal ein wenig mit Pascal und C gewerkelt. Aber lang ist es her.

Das ist auf jeden Fall mal ein Ansatz.

Gruß

Uli
Titel: Antw:Perl: Zeichenketten beschneden / split
Beitrag von: dev0 am 08 Juli 2017, 09:52:51
Zitat von: hummeruli am 07 Juli 2017, 16:57:50
Kenne mich nicht aus mit Perl. War mir immer zu Kryptisch.
Habe früher mal ein wenig mit Pascal und C gewerkelt.
Perl's sprint hält sich an die kryptischen C Konventionen ;)

Alternativ capture groups einer regexp verwenden:

$rgb =~ m/^(..)(..)(..)$/;

Die Werte sind dann in den Variablen $1, $2, $3 verfügbar.