Schrift
[thread]8837[/thread]

Prüfen ob ein Modul installiert ist (Seite 2)

Leser: 5


<< |< 1 2 >| >> 17 Einträge, 2 Seiten
pq
 2007-03-13 16:53
#75016 #75016
User since
2003-08-04
12208 Artikel
Admin1
[Homepage]
user image
[quote=GwenDragon,13.03.2007, 13:34]
Code: (dl )
1
2
eval "require NonExistantPackage;";
print "Modul nicht installiert" if $@;
[/quote]
bei require kann man auch block-eval nehmen.
Code: (dl )
1
2
3
4
eval {
 require Module;
};
print "Modul nicht installiert" if $@;
Always code as if the guy who ends up maintaining your code will be a violent psychopath who knows where you live. -- Damian Conway in "Perl Best Practices"
lesen: Wiki:Wie frage ich & perlintro Wiki:brian's Leitfaden für jedes Perl-Problem
bloonix
 2007-03-16 19:59
#75017 #75017
User since
2005-12-17
1615 Artikel
HausmeisterIn
[Homepage]
user image
Wenn

eval { use $modul; }

fehl schlägt, heisst das noch lange nicht, dass ein Modul nicht
installiert ist, sondern allerhöchstens, dass ein Modul aus irgendeinem
Grund nicht eingebunden werden konnte. Es können auch diverse
andere Fehler beim Einbinden aufgetreten sein. Vielleicht fehlen
Dependencies oder es gibt Compilerfehler.

print "Modul nicht installiert" if $@;

kann also nicht richtig sein. Eher wohl

print "Modul konnte nicht eingebunden werden: ".$@;\n\n

<!--EDIT|opi|1174068129-->
What is a good module? That's hard to say.
What is good code? That's also hard to say.
One man's Thing of Beauty is another's man's Evil Hack.
kristian
 2007-03-16 20:16
#75018 #75018
User since
2005-04-14
684 Artikel
BenutzerIn
[Homepage] [default_avatar]
Hallo

Wenn eval { use $modul }; fehlschlägt ist alles in Ordnung.
perldoc -f use .....
"Module must be a bareword"

Gruss
Kristian
renee
 2007-03-16 20:22
#75019 #75019
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
ein use in einem Block-eval ist eh sinnlos (wenn es um Fehlerabfangen des use geht), da das use zu Compile-Zeit ausgeführt wird...

Entweder require verwenden oder das use-Statement als String-eval machen...
OTRS-Erweiterungen (http://feature-addons.de/)
Frankfurt Perlmongers (http://frankfurt.pm/)
--

Unterlagen OTRS-Workshop 2012: http://otrs.perl-services.de/workshop.html
Perl-Entwicklung: http://perl-services.de/
bloonix
 2007-03-16 20:28
#75020 #75020
User since
2005-12-17
1615 Artikel
HausmeisterIn
[Homepage]
user image
[quote=kristian,16.03.2007, 19:16]"Module must be a bareword"[/quote]
du verwechselst hier ganz klar use mit require ;)

Code: (dl )
1
2
3
my $modul = 'IO::Socket';
eval "use $modul;";
die "fehler: $@" if $@;


das funktioniert hervorragend!\n\n

<!--EDIT|opi|1174069750-->
What is a good module? That's hard to say.
What is good code? That's also hard to say.
One man's Thing of Beauty is another's man's Evil Hack.
renee
 2007-03-16 20:30
#75021 #75021
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Ja, aber nur weil es in ein String-eval eingebettet ist... Im Block-eval wie Du es gezeigt hast, funktioniert es nicht.

Edit: Bei require funktioniert es immer auch mit Variablen...\n\n

<!--EDIT|renee|1174069910-->
OTRS-Erweiterungen (http://feature-addons.de/)
Frankfurt Perlmongers (http://frankfurt.pm/)
--

Unterlagen OTRS-Workshop 2012: http://otrs.perl-services.de/workshop.html
Perl-Entwicklung: http://perl-services.de/
bloonix
 2007-03-16 20:40
#75022 #75022
User since
2005-12-17
1615 Artikel
HausmeisterIn
[Homepage]
user image
[quote=renee,16.03.2007, 19:22]ein use in einem Block-eval ist eh sinnlos (wenn es um Fehlerabfangen des use geht), da das use zu Compile-Zeit ausgeführt wird...

Entweder require verwenden oder das use-Statement als String-eval machen...[/quote]
jo, wenn es allerdings rein um das Prüfen gehen würde, ob das Modul installiert ist...

Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
use strict;
use warnings;
use Data::TreeDumper;
use File::Spec;

my %modules = (
  map { $_ => undef }
  qw(IO::Socket IO::Socket::SSL Data::Dumper)
);

foreach my $pm (keys %modules) {
  foreach my $path (@INC) {
     my $file = File::Spec->catfile($path, split(/::/, $pm)). '.pm';
     if (-e $file) {
        $modules{$pm} = $file;
        next;
     }
  }
}

print DumpTree(\%modules);


|- Data::Dumper = /usr/lib/perl5/5.8.8/i586-linux-thread-multi/Data/Dumper.pm  [S1]
|- IO::Socket = /usr/lib/perl5/5.8.8/i586-linux-thread-multi/IO/Socket.pm  [S2]
`- IO::Socket::SSL = /usr/lib/perl5/vendor_perl/5.8.8/IO/Socket/SSL.pm  [S3]


Abwägig, aber es klappt. :)\n\n

<!--EDIT|opi|1174070552-->
What is a good module? That's hard to say.
What is good code? That's also hard to say.
One man's Thing of Beauty is another's man's Evil Hack.
<< |< 1 2 >| >> 17 Einträge, 2 Seiten



View all threads created 2007-03-13 14:24.