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
Ich weiß zwar keinen Ersatz, aber ich habe jetzt use v5.10.1; eingebaut. Danke dafür!
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
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.
Das ist in Ordnung so.
Trotzdem würde eine Antwort noch weiterhelfen: wo ist der Unterschied zu '=~' ?
$_[0] ~~ /^\d+$/
Danke!
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.
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...
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.
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