Autor Thema: if $blah == "string" # asking for trouble  (Gelesen 750 mal)

Offline RichardCZ

  • Tester
  • Sr. Member
  • ****
  • Beiträge: 558
  • HoBo: zwischen Weltherrschaft und Intensivstation
    • Experimenteller FHEM Fork
if $blah == "string" # asking for trouble
« am: 13 April 2020, 10:46:08 »
Nachdem ich zunehmend über diese Konstrukte stolpere, habe ich mir gedacht es wäre wieder an der Zeit für ein wenig "grep und tamtam".

Ich habe zwar einiges ausgefiltert, aber es kann sein, dass der Ein- oder Andere im u.g. false Positives (Kommentare, eigtl. JS code) entdeckt. Ich gehe stark davon aus, dass dies wieder ellenlange Diskussionen zur Folge haben wird wo diese Ergebnisse in Frage gestellt oder am besten gleich wegdiskutiert werden.
Aber ich kann mich auch irren - überrascht mich mal.

entweder ich schreibe
if ($x == 5)
oder
if ($x eq '5') # bitte gewöhnt euch an nicht " zu verwenden wenn ihr nicht interpoliert
aber nie
if ($x == "5")


FHEM/19_VBUSIF.pm:            if ( $protoVersion == "10" && length($msg) >= 20 ) {
FHEM/19_VBUSIF.pm:            if ( $protoVersion == "20" ) {
FHEM/10_IT.pm:        if ( $groupBit == "1" ) {
FHEM/21_VBUSDEV.pm:    if ( $dst_addr == "0000" ) {
FHEM/21_VBUSDEV.pm:    if ( $dst_addr == "0010" ) {
FHEM/21_VBUSDEV.pm:    if ( $dst_addr == "0015" ) {
FHEM/21_VBUSDEV.pm:    if ( $dst_addr == "0020" ) {
FHEM/21_VBUSDEV.pm:    if ( $dst_addr == "0040" ) {
FHEM/21_VBUSDEV.pm:    if ( $dst_addr == "0050" ) {
FHEM/21_VBUSDEV.pm:    if ( $dst_addr == "6521" ) {
FHEM/10_ZWave.pm:    return "ccsChanged:$p" if ( $t == "05" );
FHEM/10_ZWave.pm:    if ( $t == "08" && $p =~ m/^(..)(..)$/ ) {
FHEM/10_ZWave.pm:    if ( $t == "03" ) {
FHEM/90_SIGNALduino_un.pm:    if ( $protocol == "21" && length($bitData) >= 32 )    ##Einhell doorshutter
FHEM/90_SIGNALduino_un.pm:    elsif ( $protocol == "23" && length($bitData) >= 32 )    ##Perl Sensor
FHEM/00_NetzerI2C.pm:              if ( ( hex( $a[3] ) ) == "00" )
FHEM/00_SIGNALduino.pm:    if ( $channel == "00" ) {                  # in 0 LSB first
FHEM/00_SIGNALduino.pm:    elsif ( $channel == "10" ) {               # in 4 LSB first
FHEM/00_SIGNALduino.pm:    elsif ( $channel == "01" ) {               # in 4 LSB first
FHEM/59_WWO.pm:                    #next if((!defined($value)) || ($value == ""));
FHEM/10_DUOFERNSTICK.pm:        if ( AttrVal( $defs{$d}{NAME}, "ignore", "0" ) == "0" ) {
FHEM/98_Verkehrsinfo.pm:    if ( AttrVal( $name, "disable", "0" ) == "0" ) {
FHEM/14_SD_WS.pm:        if ( $temptyp == "11111110" ) {
FHEM/14_SD_WS.pm:            if ( $temptyp == "11111101" ) {
FHEM/14_SD_WS.pm:        if ( $temptyp == "11111111" ) {
FHEM/71_PIONEERAVRZONE.pm:                    if ( $1 == "0" ) {
FHEM/71_PIONEERAVRZONE.pm:                    elsif ( $1 == "1" ) {
FHEM/71_PIONEERAVRZONE.pm:                    if ( $1 == "0" ) {
FHEM/71_PIONEERAVRZONE.pm:                    elsif ( $1 == "1" ) {
FHEM/71_PIONEERAVRZONE.pm:                    if ( $1 == "0" ) {
FHEM/71_PIONEERAVRZONE.pm:                    elsif ( $1 == "1" ) {
FHEM/10_UNIRoll.pm:    if ( $tm == "0" ) {
FHEM/36_LaCrosseGateway.pm:    if ( AttrVal( $name, "loopTimeReadings", "0" ) == "1" ) {
FHEM/49_SSCam.pm:                if ( $rectime == "0" ) {
FHEM/AttrTemplate.pm:        if($("select.set").val() == "attrTemplate") {
FHEM/21_N4HMODULE.pm:        if ( hex( substr( $ddata, 2, 2 ) ) == "1F" ) {
FHEM/21_N4HMODULE.pm:        elsif ( hex( substr( $ddata, 2, 2 ) ) == "29" ) {
FHEM/10_MAX.pm:                #@args == 3 and $args[1] == "until"
FHEM/24_NetIO230B.pm:        if ( $state == "???" ) {    #initialize state
FHEM/17_EGPM2LAN.pm:      . ( $port == "1" ? $state : "" )
FHEM/17_EGPM2LAN.pm:      . ( $port == "2" ? $state : "" )
FHEM/17_EGPM2LAN.pm:      . ( $port == "3" ? $state : "" )
FHEM/17_EGPM2LAN.pm:      . ( $port == "4" ? $state : "" );
FHEM/14_SD_WS09.pm:        if ( $whid == "1010" ) {
FHEM/14_SD_WS09.pm:        elsif ( $whid == "1011" ) {
FHEM/14_SD_WS09.pm:        elsif ( $whid == "0111" ) {
FHEM/14_SD_WS09.pm:        if ( $wh == "11111110" && length($bitData) > $minL1 ) {
FHEM/89_VCONTROL.pm:        if ( substr( $hexline, 0, 2 ) == "00" ) {
FHEM/89_VCONTROL.pm:                if ( substr( $hexline, 0, 2 ) == "00" ) {
FHEM/UConv.pm:    return $i if ( !wantarray && defined($txt) && $txt == "0" );    # <------ das war der Grund für mein grep
FHEM/70_PIONEERAVR.pm:            if ( $1 == "1" ) {
FHEM/70_PIONEERAVR.pm:            if ( $mute == "1" ) {
FHEM/70_PIONEERAVR.pm:            if ( $signalSelect == "0" ) {
FHEM/70_PIONEERAVR.pm:            elsif ( $signalSelect == "1" ) {
FHEM/70_PIONEERAVR.pm:            elsif ( $signalSelect == "2" ) {
FHEM/70_PIONEERAVR.pm:            elsif ( $signalSelect == "3" ) {
FHEM/70_PIONEERAVR.pm:            elsif ( $signalSelect == "9" ) {
FHEM/70_PIONEERAVR.pm:            if ( $speakers == "0" ) {
FHEM/70_PIONEERAVR.pm:            elsif ( $speakers == "1" ) {
FHEM/70_PIONEERAVR.pm:            elsif ( $speakers == "2" ) {
FHEM/70_PIONEERAVR.pm:            elsif ( $speakers == "3" ) {
FHEM/70_PIONEERAVR.pm:            if ( $power == "0" ) {
FHEM/70_PIONEERAVR.pm:            if ( $1 == "1" ) {
FHEM/70_PIONEERAVR.pm:            if ( $1 == "1" ) {
FHEM/70_PIONEERAVR.pm:            if ( $1 == "1" ) {
Informativ Informativ x 1 Liste anzeigen

Offline andies

  • Tester
  • Hero Member
  • ****
  • Beiträge: 2721
Antw:if $blah == "string" # asking for trouble
« Antwort #1 am: 13 April 2020, 11:11:56 »
Also ich lese Deine Posts mit großer Begeisterung, emotional für mich (=vermutlich DAU höchste Stufe) wie ein Krimi. Und hier habe ich eine Frage.

Bei Interpolation nehme ich  ". Wenn ich keine Variablen im String habe, dann aber welche hineinkommen (weil ich Temperaturen nun doch mitsenden will), muss ich rechtzeitig schalten und aus ' dann " im String machen. Wäre es nicht sinnvoller, gleich bei " zu bleiben - das erspart mir eine mögliche Fehlerquelle? Wo ist die Fehlerquelle, die ich durch Deinen Vorschlag ausschließe?

Oder ist das nur DAU...
FHEM 6.0 auf RaspPi3 (Raspbian:  4.19.97-v7+ ); Perl: v5.28.1
SIGNALduino (433 MHz) und HM-UART (868 MHz)
wenige Brennenstuhl-IT, Sonoff, Blitzwolf, Somfy RTS, CAME-Gartentor, Volkszähler, Keyence-Sensor, Homematic-Sensoren und -thermostat, Ferraris-Zähler für Wasseruhr, Openlink-Nachbau Viessmann

Offline herrmannj

  • Global Moderator
  • Hero Member
  • ****
  • Beiträge: 5605
Antw:if $blah == "string" # asking for trouble
« Antwort #2 am: 13 April 2020, 11:17:55 »
Ich empfinde den Wunsch "besser zu werden" sehr gut. Verständnis Fragen stehen mMn im Kontrast zum "D" in DAU - das passt so gar nicht.
smartVisu mit fronthem, einiges an HM, RFXTRX, Oregon, CUL, Homeeasy, ganz viele LED + Diverse
Zustimmung Zustimmung x 1 Liste anzeigen

Offline RichardCZ

  • Tester
  • Sr. Member
  • ****
  • Beiträge: 558
  • HoBo: zwischen Weltherrschaft und Intensivstation
    • Experimenteller FHEM Fork
Antw:if $blah == "string" # asking for trouble
« Antwort #3 am: 13 April 2020, 11:25:31 »
Bei Interpolation nehme ich  ". Wenn ich keine Variablen im String habe, dann aber welche hineinkommen (weil ich Temperaturen nun doch mitsenden will), muss ich rechtzeitig schalten und aus ' dann " im String machen. Wäre es nicht sinnvoller, gleich bei " zu bleiben - das erspart mir eine mögliche Fehlerquelle? Wo ist die Fehlerquelle, die ich durch Deinen Vorschlag ausschließe?

Der Profi nimmt

q{Hier kann's echt "dicke" stehen und wir interpolieren nicht.}
qq{Hier kann's immer noch echt "dicke" stehen und wir interpolieren $var}


oder

$out =<< "EOT";
$out =<< 'EOT';


  • Ich brauche kein \"Zahnstocher\"-Syndrom.
  • Ein q hin und weg und ich muss sonst nix anfassen

Man programmiert auch nicht auf Vorrat bzw. im vorauseilenden Gehorsam, sprich ich programmiere nicht "UNDEFINED" nur weil ich glaube, dass in 20 Jahren in irgendeinem Paralleluniversum daraus ein "UNDEFINED: $var" werden könnte.

Die Fehlerquelle, die durch "meinen" Vorschlag ausgeschlossen wird ist im PBP Seite 51-53 beschrieben.

PS: Niemand hier der fragt und besser werden will muss sich als DAU bezeichnen.

Offline RichardCZ

  • Tester
  • Sr. Member
  • ****
  • Beiträge: 558
  • HoBo: zwischen Weltherrschaft und Intensivstation
    • Experimenteller FHEM Fork
Antw:if $blah == "string" # asking for trouble
« Antwort #4 am: 13 April 2020, 12:04:44 »
By the way - ich bringe immer nur ein Beispiel einer ganzen Problemklasse und gehe davon aus es ist genug Abstraktionsvermögen vorhanden um eigenständig die ganze Problemklasse anzugehen.

(daher z.B. im parallelen Thread der grep nur nach min und nicht auch noch max.)

Aber ich erinnere nur an diesen Umstand, weil natürlich == 'x' auch vorhanden ist,

FHEM/37_plex.pm:              if ( $cmd == 'watched' );
FHEM/10_IT.pm:            if (   ( $onoffcode == '01' && $groupBit == '01' )
FHEM/10_IT.pm:                || ( $onoffcode == '00' && $groupBit == '11' ) )
FHEM/10_ZWave.pm:    if ( $cmd == '02' ) {
FHEM/10_ZWave.pm:    elsif ( $cmd == '04' ) {
FHEM/10_ZWave.pm:    elsif ( $cmd == '05' ) {
FHEM/10_ZWave.pm:    elsif ( $cmd == '07' ) {

Und die ganze inverse Problemklasse ist ja auch vorhanden. Sogar noch heftiger, daher nur ein count:

$ grep -rP ' eq [0-9]' FHEM/ | grep .pm | wc -l
234


Klar werden unter diesen 234 Fällen ein paar false Positives sein, aber ist die absolute Minderheit.



Man mag ja Begriffe wie Müllberg, Messiewohnung etc. nicht mögen, aber wer glaubt ich sei nur hysterisch, der täuscht sich gewaltig.

Offline Wzut

  • Developer
  • Hero Member
  • ****
  • Beiträge: 3496
Antw:if $blah == "string" # asking for trouble
« Antwort #5 am: 13 April 2020, 12:17:31 »
Zitat
FHEM/10_MAX.pm:                #@args == 3 and $args[1] == "until"
man beachte das # :) , die Zeile darunter lautet :
return "Second parameter must be 'until'" if($args[1] ne "until");
da kann man jetzt naürlich noch das "until" anmeckern, aber seit wir das Thema  ' vs. " ja vor ein paar Tagen schon in der Perl Ecke mal durchgesprochen haben bin ich dafür wesentlich sensibler geworden.

Maintainer der Module: MAX, MPD, UbiquitiMP, UbiquitiOut, SIP, BEOK, readingsWatcher

Offline RichardCZ

  • Tester
  • Sr. Member
  • ****
  • Beiträge: 558
  • HoBo: zwischen Weltherrschaft und Intensivstation
    • Experimenteller FHEM Fork
Antw:if $blah == "string" # asking for trouble
« Antwort #6 am: 13 April 2020, 12:25:30 »
man beachte das # :) , die Zeile darunter lautet :

Ich habe zwar einiges ausgefiltert, aber es kann sein, dass der Ein- oder Andere im u.g. false Positives (Kommentare, eigtl. JS code) entdeckt.

Offline rudolfkoenig

  • Administrator
  • Hero Member
  • *****
  • Beiträge: 22328
Antw:if $blah == "string" # asking for trouble
« Antwort #7 am: 13 April 2020, 12:26:02 »
Zitat
Man mag ja Begriffe wie Müllberg, Messiewohnung etc. nicht mögen, aber wer glaubt ich sei nur hysterisch, der täuscht sich gewaltig.
Mag sein, dss ich mich taeusche, ich glaube trotzdem, dass Du hysterisch bist :) Aus den gezeigten 6 Beispielen ist nur die Erste ein  Problem, und das wird bei Benutzung per Warning in fhem.log vermerkt. Ich habe die angemeckerten Zeilen in ZWave.pm natuerlich geaendert (trotz deiner Vermutung mag ich nicht in Muell wohnen), und als Konsequenz muss ich wohl in der Zukunft Patches staerker unter die Lupe nehmen, das wird wohl laenger dauern, seufz.

Offline RichardCZ

  • Tester
  • Sr. Member
  • ****
  • Beiträge: 558
  • HoBo: zwischen Weltherrschaft und Intensivstation
    • Experimenteller FHEM Fork
Antw:if $blah == "string" # asking for trouble
« Antwort #8 am: 13 April 2020, 12:31:22 »
Mag sein, dss ich mich taeusche, ich glaube trotzdem, dass Du hysterisch bist :) Aus den gezeigten 6 Beispielen ist nur die Erste ein  Problem

Das ist schon ok. Ich bin hysterisch und Du bist phlegmatisch. Das gleicht sich aus.

Ich weiß jetzt nicht wo ich 6 Beispiele anführe, ich komme mittlerweile auf über 300.

Offline Loredo

  • Developer
  • Hero Member
  • ****
  • Beiträge: 3752
  • ~ Challenging Innovation ~
Antw:if $blah == &quot;string&quot; # asking for trouble
« Antwort #9 am: 13 April 2020, 12:36:01 »
Das macht Shutdown also mit Menschen. Wie sagt man so schön: Bitte bleiben Sie gesund.
Hat meine Arbeit dir geholfen? ⟹ https://paypal.me/pools/c/8gDLrIWrG9

Maintainer:
FHEM-Docker Image, https://github.com/fhem, Astro(Co-Maintainer), ENIGMA2, GEOFANCY, GUEST, HP1000, Installer, LaMetric2, MSG, msgConfig, npmjs, PET, PHTV, Pushover, RESIDENTS, ROOMMATE, search, THINKINGCLEANER
Gefällt mir Gefällt mir x 5 Liste anzeigen

Offline Sidey

  • Developer
  • Hero Member
  • ****
  • Beiträge: 2515
Antw:if $blah == "string" # asking for trouble
« Antwort #10 am: 03 Mai 2020, 00:14:36 »
q{Hier kann's echt "dicke" stehen und wir interpolieren nicht.}
qq{Hier kann's immer noch echt "dicke" stehen und wir interpolieren $var}

[/tt]


Ich hab mich den Zahnstochern mal gewidmet, wo ich ohnehin gerade was ändere.

qq[$name: hier steht was.. $id -> .$hash->{protocolObject}->getProperty($id,'name')];

Leider werden nur Variablen interpoliert und Funktionsaufrufe schaffen es leider nicht. Interessant ist, dass $hash->{protocolObject} natürlich interpoliert wird :)


Ich hätte angenommen, ein einfaches maskieren für einen scalar reicht, aber nein, klappt auch nicht.
qq[$name: hier steht was.. $id -> ${$hash->{protocolObject}->getProperty($id,'name')}];

Das war für qq dann wohl zu Dicke.
Über eine Idee, außer das Ergebnis vorher in eine Variable legen würde ich mich freuen.

PS:
So geht es natürlich:
qq[$name: hier steht was.. $id ->] .${$hash->{protocolObject}->getProperty($id,'name')};
Signalduino, HMLan, Raspberry Pi, Mysensors, MQTT, Alexa

Offline RichardCZ

  • Tester
  • Sr. Member
  • ****
  • Beiträge: 558
  • HoBo: zwischen Weltherrschaft und Intensivstation
    • Experimenteller FHEM Fork
Antw:if $blah == "string" # asking for trouble
« Antwort #11 am: 03 Mai 2020, 20:01:10 »
Das Ergebnis vorher in eine Variable ist aber wohl die sauberste Lösung.

Interpoliert werden Skalare, Listen, Hashes, Keine Coderefs.

 

decade-submarginal