FHEM Forum

FHEM - Hausautomations-Systeme => MAX => Thema gestartet von: tybytyby am 11 Oktober 2013, 11:46:08

Titel: MAX Modul ohne Smartmatch Operator für ältere Perl Versionen ?
Beitrag von: tybytyby am 11 Oktober 2013, 11:46:08
Hallo zusammen,

im MAX Modul (10_MAX.pm) wird der Smartmatch-Operator ('~~') verwendet, der erst ab Perl v5.10.1 zur Verfügung steht (s. http://perldoc.perl.org/perlop.html#Smartmatch-Operator (//perldoc.perl.org/perlop.html#Smartmatch-Operator) ). Kleinere Geräte (NAS) haben heufig leider nur Perl v5.8.
Hat jemand eine Idee, wie man den Smartmatch Operator ersetzen könnte, damit das Modul auch mit älteren Perl Versionen kompatibel bleibt?

Ansonsten würde so etwas im Code bei der Fehlersuche vielleicht helfen:
use v5.10.1;

Danke,
Tibi
Titel: Antw:MAX Modul ohne Smartmatch Operator für ältere Perl Versionen ?
Beitrag von: Matthias Gehre am 16 Oktober 2013, 21:19:00
Ich weiß zwar keinen Ersatz, aber ich habe jetzt use v5.10.1; eingebaut. Danke dafür!
Titel: Antw:MAX Modul ohne Smartmatch Operator für ältere Perl Versionen ?
Beitrag von: tybytyby am 23 Oktober 2013, 17:59:01
Ich habe einige Zeit mit Aktualisierung von Perl verbracht und das ist leider keine Option für mich, ich muss bei v5.8.8 bleiben. :(  Deshalb nochmal ein Eintrag in diesem Thread...  ;)

Ich habe mir die MAX-Module angeschaut. Oft wird der Smartmatch-Operator verwendet, um zu prüfen, ob ein Element in einem Array vorkommt.
Ich glaube, man könnte statt
if ($value ~~ @array) {... }
auch
if ( grep( /^$value$/, @array ) ) { ... }
nutzen.

Dann würde z.B:
$devicetype = "WallMountedThermostat" if($msgtype ~~ ["WallThermostatConfig","WallThermostatState","WallThermostatControl"]);
so aussehen:
$devicetype = "WallMountedThermostat" if( grep ( /^$msgtype$/, ["WallThermostatConfig","WallThermostatState","WallThermostatControl"]) );

So blieben nur noch paar ähnliche Zeilen mit Smartmatch:
validGroupid { return $_[0] ~~ /^\d+$/ && $_[0] >= 0 && $_[0] <= 255; }

Aber ich verstehe leider nicht ganz, was
$_[0] ~~ /^\d+$/
so macht (und wo der Unterschied zu '=~' ist).

Gruß,
Tibi


Titel: Antw:MAX Modul ohne Smartmatch Operator für ältere Perl Versionen ?
Beitrag von: Matthias Gehre am 28 Oktober 2013, 23:22:57
Ich werde die Smartmatch Operatoren nicht durch kompliziertere Konstrukte ersetzen. Die Statistik zeigt, dass überwiegend neuere Perl Versionen eingesetzt werden.

Ich lasse aber dieses Thema offen, damit Leute die wirklich kein neueres Perl kriegen, sich hier über die
jeweils privat vorzunehmenden Änderungen unterhalten können.
Titel: Antw:MAX Modul ohne Smartmatch Operator für ältere Perl Versionen ?
Beitrag von: tybytyby am 29 Oktober 2013, 01:03:33
Das ist in Ordnung so.

Trotzdem würde eine Antwort noch weiterhelfen: wo ist der Unterschied zu '=~' ?
$_[0] ~~ /^\d+$/

Danke!
Titel: Antw:MAX Modul ohne Smartmatch Operator für ältere Perl Versionen ?
Beitrag von: Matthias Gehre am 30 Oktober 2013, 10:07:41
Da sich herausgestellt hat, dass Smartmatch nicht nur in alten Perl Versionen nicht funktioniert, sondern auch in kommenden Perl Versionen nicht funktionieren wird, habe ich es doch rausgenommen.
Titel: Antw:MAX Modul ohne Smartmatch Operator für ältere Perl Versionen ?
Beitrag von: Tobias am 04 November 2013, 13:07:47
Hi Matthias,
Zitat von: Matthias Gehre am 30 Oktober 2013, 10:07:41
Da sich herausgestellt hat, dass Smartmatch nicht nur in alten Perl Versionen nicht funktioniert, sondern auch in kommenden Perl Versionen nicht funktionieren wird, habe ich es doch rausgenommen.
das wusste ich auch nicht... wo kann man das denn nachlesen?
Ich habe es auch bei vielen Perl-Konstrukten eingebaut...
Titel: Antw:MAX Modul ohne Smartmatch Operator für ältere Perl Versionen ?
Beitrag von: Matthias Gehre am 04 November 2013, 13:40:51
Hier http://blogs.perl.org/users/mike_b/2013/06/a-little-nicer-way-to-use-smartmatch-on-perl-518.html (http://blogs.perl.org/users/mike_b/2013/06/a-little-nicer-way-to-use-smartmatch-on-perl-518.html) ist eine Zusammenfassung. Das steht wohl auch im Changelog von perl 5.18.
Titel: Antw:MAX Modul ohne Smartmatch Operator für ältere Perl Versionen ?
Beitrag von: tybytyby am 05 November 2013, 15:50:46
Hallo Matthias,

Zitat von: Matthias Gehre am 30 Oktober 2013, 10:07:41
Da sich herausgestellt hat, dass Smartmatch nicht nur in alten Perl Versionen nicht funktioniert, sondern auch in kommenden Perl Versionen nicht funktionieren wird, habe ich es doch rausgenommen.

Ich kam erst jetzt dazu, ein fhem-Update durchzuführen und die neue Version der Module mit Perl v5.8 auszuprobieren. Mein FHEM kann wieder alles empfangen.:)  Senden konnte ich noch nicht ausprobieren, ich muss die Heizkörperthermostate erstmal wieder installieren.
Das hier kann dann ja wieder weg: ;)
use v5.10.1;

Danke,
Tibi