Wie use Meta aber nur wenn Meta auch vorhanden ist ?

Begonnen von Wzut, 04 April 2020, 19:21:09

Vorheriges Thema - Nächstes Thema

Wzut

Ich häng jetzt schon den halben Nachmittag ein einem Problem fest mit dem ich nicht weiterkomme.
Die meisten Modulautoren schreiben einfach ein use FHEM::Meta  oder use Meta in ihre Module.
Ich möchte dies nicht so tun, da mein Modul auch auf ältereren Systemen laufen soll wo es Meta.pm noch gar nicht gab.
(Meta.pm ist ja wirklich nicht lebensnotwendig :) )
DS_Starter hat das in seinen Modulen IMHO recht  elegant gelöst , er schreibt einfach :
eval "use FHEM::Meta;1"       or my $modMetaAbsent     = 1;
und macht später das ganze Meta Gedöns von $modMetaAbsent abhängig, So schön das auch ist, leider meckert aber perlcritic
ZitatExpression form of "eval" at line blablub , column 1.  See page 161 of PBP.  (Severity: 5)
Aus dem Text auf Seite 161ff aus PBP werd ich nicht schlau. Ich habe jetzt etliches probiert mit eval {}; dann ist auch perlcritic still, nur es macht dann aber auch nicht was es soll :(


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

mahowi

Laut https://www.perlmonks.org/?node_id=691741 sollte das klappen:

eval "use FHEM::Meta";
if ( $@ ) {
     $modMetaAbsent = 1;
}
CUBe (MAX): HT, FK | CUBe (SlowRF): ESA2000WZ
JeeLink: LaCrosse | nanoCUL433: Smartwares SHS-51001-EU, EM1000GZ
ZME_UZB1: GreenWave PowerNode, Popp Thermostat | SIGNALDuino: HE877, X10 MS14A, Revolt NC-5462,  IT Steckdosen + PIR
tado° | Milight | HUE, Lightify | SmarterCoffee

RichardCZ

Da Meta ja vermutlich nicht zur Laufzeit dazukommt, fällt mir spontan ein

eval { use Meta; }

oder

BEGIN {
require $modul if (-e $modul_path);
}


genaueres: https://stackoverflow.com/questions/3945583/how-can-i-conditionally-use-a-module-in-perl
Witty House Infrastructure Processor (WHIP) is a modern and
comprehensive full-stack smart home framework for the 21st century.

Wzut

danke auch. @mahowi, dein eval "use FHEM::Meta"; ist keine Lösung für perlcritic.
@Richard, da könnte ich mir jetzt wieder in den A.... beissen , auf die -e Idee hätte ich auch selbst kommen können .... k.A. warum ich da wieder so kompliziert gedacht habe :( Anyway , nun klappt es.
Maintainer der Module: MAX, MPD, UbiquitiMP, UbiquitiOut, SIP, BEOK, readingsWatcher