if $blah == "string" # asking for trouble

Begonnen von RichardCZ, 13 April 2020, 10:46:08

Vorheriges Thema - Nächstes Thema

RichardCZ

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" ) {
Witty House Infrastructure Processor (WHIP) is a modern and
comprehensive full-stack smart home framework for the 21st century.

andies

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.1 auf RaspPi3 (Raspbian:  6.1.21-v8+; Perl: v5.32.1)
SIGNALduino (433 MHz) und HM-UART (868 MHz), Sonoff, Blitzwolf, Somfy RTS, CAME-Gartentor, Volkszähler, Keyence-Sensor, Homematic-Sensoren und -thermostat, Ferraris-Zähler für Wasseruhr, Openlink-Nachbau Viessmann

herrmannj

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.

RichardCZ

Zitat von: andies am 13 April 2020, 11:11:56
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.
Witty House Infrastructure Processor (WHIP) is a modern and
comprehensive full-stack smart home framework for the 21st century.

RichardCZ

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.
Witty House Infrastructure Processor (WHIP) is a modern and
comprehensive full-stack smart home framework for the 21st century.

Wzut

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

RichardCZ

Zitat von: Wzut am 13 April 2020, 12:17:31
man beachte das # :) , die Zeile darunter lautet :

Zitat von: RichardCZ am 13 April 2020, 10:46:08
Ich habe zwar einiges ausgefiltert, aber es kann sein, dass der Ein- oder Andere im u.g. false Positives (Kommentare, eigtl. JS code) entdeckt.
Witty House Infrastructure Processor (WHIP) is a modern and
comprehensive full-stack smart home framework for the 21st century.

rudolfkoenig

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

RichardCZ

Zitat von: rudolfkoenig am 13 April 2020, 12:26:02
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.
Witty House Infrastructure Processor (WHIP) is a modern and
comprehensive full-stack smart home framework for the 21st century.

Loredo

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

Sidey

Zitat von: RichardCZ am 13 April 2020, 11:25:31
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, Homematic, Raspberry Pi, Mysensors, MQTT, Alexa, Docker, AlexaFhem

Maintainer von: SIGNALduino, fhem-docker, alexa-fhem-docker, fhempy-docker

RichardCZ

Das Ergebnis vorher in eine Variable ist aber wohl die sauberste Lösung.

Interpoliert werden Skalare, Listen, Hashes, Keine Coderefs.
Witty House Infrastructure Processor (WHIP) is a modern and
comprehensive full-stack smart home framework for the 21st century.