FHEM Forum

FHEM - Entwicklung => FHEM Development => Perl Ecke => Thema gestartet von: Wzut am 04 April 2020, 19:21:09

Titel: Wie use Meta aber nur wenn Meta auch vorhanden ist ?
Beitrag von: Wzut am 04 April 2020, 19:21:09
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 :(


Titel: Antw:Wie use Meta aber nur wenn Meta auch vorhanden ist ?
Beitrag von: mahowi am 04 April 2020, 20:18:25
Laut https://www.perlmonks.org/?node_id=691741 sollte das klappen:

eval "use FHEM::Meta";
if ( $@ ) {
     $modMetaAbsent = 1;
}
Titel: Antw:Wie use Meta aber nur wenn Meta auch vorhanden ist ?
Beitrag von: RichardCZ am 04 April 2020, 20:18:54
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
Titel: Antw:Wie use Meta aber nur wenn Meta auch vorhanden ist ?
Beitrag von: Wzut am 05 April 2020, 13:47:27
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.