MAX Modul ohne Smartmatch Operator für ältere Perl Versionen ?

Begonnen von tybytyby, 11 Oktober 2013, 11:46:08

Vorheriges Thema - Nächstes Thema

tybytyby

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

Matthias Gehre

Ich weiß zwar keinen Ersatz, aber ich habe jetzt use v5.10.1; eingebaut. Danke dafür!

tybytyby

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



Matthias Gehre

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.

tybytyby

Das ist in Ordnung so.

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

Danke!

Matthias Gehre

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.

Tobias

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...
Maintainer: Text2Speech, TrashCal, MediaList

Meine Projekte: https://github.com/tobiasfaust
* PumpControl v2: allround Bewässerungssteuerung mit ESP und FHEM
* Ein Modbus RS485 zu MQTT Gateway für SolarWechselrichter


tybytyby

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