Schrift
[thread]873[/thread]

Perl-Modul nur einbinden, wenn auch installiert?

Leser: 1


<< |< 1 2 3 >| >> 26 Einträge, 3 Seiten
x-man
 2007-01-05 01:16
#9454 #9454
User since
2003-09-11
67 Artikel
BenutzerIn
[default_avatar]
Ich habe hier 2 Code-Beispiele. Beide erzeugen Fehlermeldung. Ist es möglich, ein Modul erst einzubinden, wenn sichergestellt wird, dass es auch installiert ist.

CODE 1:
#########################################
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#!/usr/bin/perl              &n
bsp;
use CGI::Carp qw(fatalsToBrowser);
use CGI qw(:standard);
eval "use GD";
if(!$@){
&start;
}
else{
die "Modul nicht installiert!";
}
sub start{
print "Content-type: image/png\n\n";
$image = new GD::Image(100,20);
$rot = $image->colorAllocate(255,0,0);
$weiss = $image->colorAllocate(255,255,255);
$image->string(gdMediumBoldFont,3,5,"Test",$weiss);
binmode STDOUT;
print $image->jpeg;
}




CODE 2
########################################
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#!/usr/bin/perl              &n
bsp;
use CGI::Carp qw(fatalsToBrowser);
use CGI qw(:standard);
use GD;
&start;
sub start{
print "Content-type: image/png\n\n";
$image = new GD::Image(100,20);
$rot = $image->colorAllocate(255,0,0);
$weiss = $image->colorAllocate(255,255,255);
$image->string(gdMediumBoldFont,3,5,"Test",$weiss);
binmode STDOUT;
print $image->jpeg;
}
\n\n

<!--EDIT|renee|1167987607-->
PerlProfi
 2007-01-05 01:31
#9455 #9455
User since
2006-11-29
340 Artikel
BenutzerIn
[default_avatar]
Das sollte mit eval{}, require() und import() funktionieren:
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#!/usr/bin/perl
use strict;
use warnings 'all';

eval { require GD };
unless ($@)
{
import GD;
# start
}
else
{
die "module 'GD' not installed";
exit(1);
}

exit(0);

__END__


MfG PerlProfi
bloonix
 2007-01-05 05:11
#9456 #9456
User since
2005-12-17
1615 Artikel
HausmeisterIn
[Homepage]
user image
Hallo x-man,

welchen Sinn soll die Prüfung haben?

Das verstehe ich nicht so ganz!

Gruss,
opi
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.
topeg
 2007-01-05 06:52
#9457 #9457
User since
2006-07-10
2611 Artikel
BenutzerIn

user image
Das ist ganz interessant wenn man die Wahl zwischen mehrerene Biblothetken hat, die ähnliches leisten können, z.B. Image::Magick, GD oder Gimp. Zum Schluss könnte man noch seine eigene GD-Biblothek mitlifern, auf die man im Notfall zugreifen kann.
pq
 2007-01-05 10:36
#9458 #9458
User since
2003-08-04
12208 Artikel
Admin1
[Homepage]
user image
[quote=x-man,05.01.2007, 00:16]Ich habe hier 2 Code-Beispiele. Beide erzeugen Fehlermeldung. Ist es möglich, ein Modul erst einzubinden, wenn sichergestellt wird, dass es auch installiert ist.

eval "use GD";
if(!$@){
            &start;
}
else{
            die "Modul nicht installiert!";
}[/quote]
ja kein wunder, wenn du sowieso ein die() machst, wenn das modul
nicht da ist.
das wichtigste ist aber: was soll denn dein script machen, wenn das
modul nicht da ist? es muss ja was sinnvolles ausgeben.
solange es das nicht tut, kannst du das script auch sterben lassen.

im übrigen gibt es hier im forum code-tags, und da du schon 62
beiträge hast, kann ich mir nicht vorstellen, dass du das noch nie
gesehen hast...\n\n

<!--EDIT|pq|1167986233-->
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
PerlProfi
 2007-01-05 14:35
#9459 #9459
User since
2006-11-29
340 Artikel
BenutzerIn
[default_avatar]
Ich glaube nicht, dass er die Meldung meinte, die beim die() rauskommt.
Wenn doch, dann verstehe ich nicht ganz, was du denn eigentlich wolltest.

Allerdings habe ich gerade auch mal deine beiden code stücke ausprobiert, und das erste funktioniert bei mir sehr gut.
Beim zweiten ist ja klar, dass die Fehlermeldung da von Perl kommt, wenn du kein GD hast.

edit:
Vielleicht meintest du eher soetwas:
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
#!/usr/bin/perl
use strict;
use warnings 'all';

# we need GD
eval { require GD };
unless ($@)
{
# if GD is installed, call GD::import
import GD;

# and start
start();
}
else
{
# exit with errorlevel > 0
exit(1);
}

# all was right, so exit with errorlevel == 0
exit(0);

# start here(GD is installed)
sub start
{
print "Content-type: image/png\n\n";

my $image = new GD::Image(100,20);
my $rot = $image->colorAllocate(255,0,0);
my $weiss = $image->colorAllocate(255,255,255);

$image->string(GD::gdMediumBoldFont(),3,5,"Test",$weiss);
binmode STDOUT;
print $image->jpeg;
} # start

__END__

Ich habe noch GD vor und () nach gdMediumBoldFont gesetzt, weil das ja eine Funktion ist, die nicht standardmäßig exportiert wird, und ohne die () als Bareword erkannt wird.

MfG PerlProfi\n\n

<!--EDIT|PerlProfi|1168001280-->
x-man
 2007-01-05 14:39
#9460 #9460
User since
2003-09-11
67 Artikel
BenutzerIn
[default_avatar]
@alle: Danke für die schnellen Antworten
@pq: die ist nur ein Beispiel. Ich wollte nicht den ganzen Code posten. Das mit den Code-Tags mache ich beim nächsten Posting ;-)
pq
 2007-01-05 14:50
#9461 #9461
User since
2003-08-04
12208 Artikel
Admin1
[Homepage]
user image
[quote=x-man,05.01.2007, 13:39]Das mit den Code-Tags mache ich beim nächsten Posting ;-)[/quote]
du kannst deine postings auch nachträgilch editieren. in diesem fall
war renee so nett und hat das für dich erledigt.
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
x-man
 2007-01-05 15:07
#9462 #9462
User since
2003-09-11
67 Artikel
BenutzerIn
[default_avatar]
[quote=opi,05.01.2007, 04:11]welchen Sinn soll die Prüfung haben?[/quote]
Der Sinn der Prüfung ist die Fehlermeldung zu unterdrücken und ggf. ein anderes Modul zu verwenden. Wenn GD nicht installiert ist und ich
Code: (dl )
use GD;

verwende, erhalte ich folgende Fehlermeldung:
Code: (dl )
Can't locate GD.pm in @INC...


Nun habe ich es mit
Code: (dl )
eval "use GD;";

probiert. Die Fehlermeldung erhalte ich trotzdem. Wie kann ich das umgehen?
PerlProfi
 2007-01-05 15:09
#9463 #9463
User since
2006-11-29
340 Artikel
BenutzerIn
[default_avatar]
So:
[quote=PerlProfi,05.01.2007, 00:31]Das sollte mit eval{}, require() und import() funktionieren:
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#!/usr/bin/perl
use strict;
use warnings 'all';

eval { require GD };
unless ($@)
{
import GD;
# start
}
else
{
die "module 'GD' not installed";
exit(1);
}

exit(0);

__END__


MfG PerlProfi[/quote]

Ich benutze eval{} mit Blockschreibweise, dann werden die Fehlermeldungen nur in $@ gespeichert und dein Programm stürzt auch bei fatalen Fehlern nicht ab.

MfG PerlProfi
<< |< 1 2 3 >| >> 26 Einträge, 3 Seiten



View all threads created 2007-01-05 01:16.