[gelöst] Werte ersetzen

Begonnen von juemuc, 02 März 2023, 12:19:37

Vorheriges Thema - Nächstes Thema

juemuc

Hallo,

ich versuche in einer Variablen Werte zu ersetzen. Leider ohne Erfolg. Wer kann helfen?
Ich möchte aus der Variablen $EVENT den Teil $EVTPART0 löschen.
Hier meine Definition:
my $Info=$EVENT;
$Info=~ s/$EVTPART0//


In $Info steht aber weiterhin $EVENT komplett.

Viele Grüße
Jürgen
3x Sonos Play 1, 1x Sonos Arc + Sub, 1 Sonos-One, 1x Sonos Playbar
FB6690 + FB7490 mit 4x Dect 200 und 3 Dect-ULE-Thermostate,  raspberry3B+, HM Funkmodul HM-MOD-RPI-PCB, HM Klingelsensor HM-Sen-DB-PCB, HM (IP) Fensterkontakte und  Amazon Echo Dot,  piVCCU, pi OS (bookworm).

frober

Was genau ist dein Ziel?

So kann das nicht funktionieren, da '$EVTPART0' nicht in $EVENT enthalten ist. Nur der Inhalt der Variablen ist enthalten.
Raspi 3b mit Raspbian Buster und relativ aktuellem Fhem,  FS20, LGW, PCA301, Zigbee, MQTT, MySensors mit RS485(CAN-Receiver) und RFM69, etc.,
einiges umgesetzt, vieles in Planung, smile

********************************************
...man wächst mit der Herausforderung...

Beta-User

Bezugnehmend auf https://forum.fhem.de/index.php/topic,132472.msg1266265.html#msg1266265: Falls du $EVENT selbst splittest, musst du auf das Array-Element verweisen.

my $Info=$EVENT;
my @EVTPART = split m{ },$EVENT;
$Info=~ s{$EVTPART[0]}{}x


Steht nichts im Log?
Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: MiLight@ESP-GW, BT@OpenMQTTGw | MySensors: seriell, v.a. 2.3.1@RS485 | ZWave | ZigBee@deCONZ | SIGNALduino | MapleCUN | RHASSPY
svn: u.a MySensors, Weekday-&RandomTimer, Twilight,  div. attrTemplate-files

juemuc

#3
Ich möchte ja nicht selbst splitten. Ich möchte einfach das was in $EVTPART0 steht aus $EVENT löschen.

Im log steht nichts.
Mit
my $Info=$EVENT;
$Info=~ s/[$EVTPART0]//g;


wird zuviel gelöscht. Ohne den Parameter g nur das erste Zeichen aus $EVTPART0  :-[

Allgemein geht es darum, aus der Zeichenkette in "VAR1" die Zeichenkette aus "VAR2" zu löschen (nur das erste vorkommen).

Viele Grüße
Jürgen
3x Sonos Play 1, 1x Sonos Arc + Sub, 1 Sonos-One, 1x Sonos Playbar
FB6690 + FB7490 mit 4x Dect 200 und 3 Dect-ULE-Thermostate,  raspberry3B+, HM Funkmodul HM-MOD-RPI-PCB, HM Klingelsensor HM-Sen-DB-PCB, HM (IP) Fensterkontakte und  Amazon Echo Dot,  piVCCU, pi OS (bookworm).

Beta-User

Kannst du das ganze mal im Zusammenhang zeigen? Ist das ein notify-DEF?

Vielleicht zum Hintergrund: fhem.pl macht vorab eine Text-Erstetzung mit den $EVENT(-Bestandteilen), das sind (jedenfalls nach meinem begrenzten Verständnis) keine echten Variablen. Es kann also durchaus sein, dass das "anders" interpretiert wird, als man das bei Perl an sich annehmen würde.

Vielleicht klappt das hier:

my $Info=$EVENT;
my $del=$EVTPART0;
$Info=~ s{$del}{};
Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: MiLight@ESP-GW, BT@OpenMQTTGw | MySensors: seriell, v.a. 2.3.1@RS485 | ZWave | ZigBee@deCONZ | SIGNALduino | MapleCUN | RHASSPY
svn: u.a MySensors, Weekday-&RandomTimer, Twilight,  div. attrTemplate-files

juemuc

Ich habe das Problem gelöst. In $EVTPART0 war ein "+" enthalten. Dadurch wurde der String nicht korrekt interpretiert. Wenn die Variable kein "Perl-Sonderzeichen" enthält, funktioniert es sofort.

Ich muss also das "+" vorher durch \+ ersetzen.

Trotzdem Danke für Eure Unterstützung.

Viele Grüße
Jürgen

3x Sonos Play 1, 1x Sonos Arc + Sub, 1 Sonos-One, 1x Sonos Playbar
FB6690 + FB7490 mit 4x Dect 200 und 3 Dect-ULE-Thermostate,  raspberry3B+, HM Funkmodul HM-MOD-RPI-PCB, HM Klingelsensor HM-Sen-DB-PCB, HM (IP) Fensterkontakte und  Amazon Echo Dot,  piVCCU, pi OS (bookworm).

Torxgewinde

Nicht immer kann man vorher die Sonderzeichen händisch escapen. Dafür gibt es eine praktische Funktion quotemeta():

my $EVENT = "Dies ist ein BeispielDasweg+gutso?Text";
my $EVTPART0 = "Dasweg+gutso?";

my $Info = $EVENT;
my $escaped_EVTPART0 = quotemeta($EVTPART0);
$Info =~ s/$escaped_EVTPART0//;

print "Ursprünglicher Wert von \$EVENT: $EVENT\n";
print "Wert von \$EVTPART0: $EVTPART0\n";
print "Ergebnis von \$Info nach der Substitution: $Info\n";