Schrift
Wiki:Tipp zum Debugging: use Data::Dumper; local $Data::Dumper::Useqq = 1; print Dumper \@var;
[thread]402[/thread]

Version eines Moduls herausfinden (Seite 2)

Leser: 5


<< |< 1 2 3 >| >> 26 Einträge, 3 Seiten
cbxk1xg
 2005-01-10 20:48
#4037 #4037
User since
2003-10-20
496 Artikel
BenutzerIn
[default_avatar]
Hallo noch mal,

also irgendwie ist das hier nicht korrekt:
Code: (dl )
$ModulVersion = ${Modul}->VERSION || 0;


Bei meinem Webspace (1&1) sagt mir das Script ich habe GD in der Version 1.30 und bei einem Webspace auf Hosteurope sagt mir das Script, ich habe GD in der Version 1.38.

Das komische ist, dass letzteres stimmt. Es deckt sich mit der Ausgabe eines anderen Scripts welches alle ENV und Module ausließt. Aber bei 1&1 ist GD in der Version 2.19 installiert.

Ich habe versucht zu verstehen wie das andere Script die Version ausliest, bin aber gescheitert. Vieleicht kann man das irgendwie adaptieren? Das Script gibt es hier: http://cgi.xwolf.de/cgi/webenv.shtml\n\n

<!--EDIT|cbxk1xg|1105383054-->
cbxk1xg
 2005-01-10 23:57
#4038 #4038
User since
2003-10-20
496 Artikel
BenutzerIn
[default_avatar]
Hat keiner 'ne Idee?
esskar
 2005-01-11 04:36
#4039 #4039
User since
2003-08-04
7321 Artikel
ModeratorIn

user image
laut http://cgi.xwolf.de/cgilocal/webenv.pl#perlmodule ist gar kein GD installiert ???
cbxk1xg
 2005-01-11 04:42
#4040 #4040
User since
2003-10-20
496 Artikel
BenutzerIn
[default_avatar]
Nun interessiert mich sein Server aber wenig. Xwolf ist ja auch nicht bei 1&1 gehostet. Ich meinte das Script als solches. Und da im Speziellen die Abfrage der Version eines Moduls.
esskar
 2005-01-11 05:14
#4041 #4041
User since
2003-08-04
7321 Artikel
ModeratorIn

user image
hellsehen kann ich ja nid.

schau dir mal ExtUtils::Installed an!
cbxk1xg
 2005-01-11 06:37
#4042 #4042
User since
2003-10-20
496 Artikel
BenutzerIn
[default_avatar]
[quote=esskar,11.01.2005, 04:14]hellsehen kann ich ja nid.

schau dir mal ExtUtils::Installed an![/quote]
War wohl ein Mißverständnis und nicht böse gemeint. Aber jetzt sag' mit doch mal bitte was mir ein Modul bringt, welches selbst abhängig ist von diversen anderen Modulen?

Ich meine das bringt mich in dem Fall nicht besonders weiter, da ich ja überhaupt erst mal prüfen will, ob ein Modul überhaupt vorhanden ist. Das mit der Version muss doch auch irgendwie anders gehen? Bei dem Xwolf-Script geht es ja auch. Ich verstehe halt nur nicht wie.
esskar
 2005-01-11 06:46
#4043 #4043
User since
2003-08-04
7321 Artikel
ModeratorIn

user image
ExtUtils::Installed ist beim standard dabei.
und woher weißt du, dass xwolf nicht auch dieses modul benutzt?
und wenn du bei 1&1 die Version 1.30 erhälst, hast du eh pech; selbst wenn du es irgendwie schafst, dass version 2.19 zu bekommen, so wirst du wohl eh immer nur mit der 1.30er arbeiten können, da diese version wohl für perl installiert ist.

anonsten kannst du mal schauen wie PerlDiver das macht!
cbxk1xg
 2005-01-11 07:14
#4044 #4044
User since
2003-10-20
496 Artikel
BenutzerIn
[default_avatar]
Quote
und woher weißt du, dass xwolf nicht auch dieses modul benutzt?


Also noch mal: Das Script kann man hier herunterladen und dann anschauen, installieren, etc...

Und die einzigen Module die in diesem Script benutzt werden sind "strict" und "File::Find". Ich verstehe halt nur nicht, wie dort die Version ausgelesen wird. Aber ich denke des Rätsels Lösung liegt in dieser SUB:
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
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
sub module {
my $name = $_;
my $packagename;
my $version;
my $pinfo;
my $vinfo;
my $packageversion;
my $line;

if ($name =~ /\.pm$/) {
open(MOD,$name) || return;
while(<MOD>) {
$line = $_;
if ($line =~ /^ *package +(\S+);/) {
$packagename = $1;
$pinfo=1;
}
if ($line =~ /\$Id: ([a-zA-Z0-9\-_\.]+),v ([0-9\.]+) /) {
# $packagename = $1;
$version = $2;
# $pinfo=1;
$vinfo++;
}
if (($packagename) && (not $vinfo)) {
$packageversion = $packagename."::VERSION";
}
if (not $vinfo) {
if ($line =~ /^\s*\$VERSION\s*=\s*(?:["\'\s]?)([0-9\.]+)(?:["\'\s]?);\s*$/) {
$version = $1;
$vinfo++;
}
if ($line =~ /Revision: ([0-9\.]+) \$/) {
$version = $1;
$vinfo++;
}
if ($line =~ /$packageversion\s*=\s*(?:["\'\s]?)([0-9\.]+)(?:["\'\s]?)/) {
$version = $1;
$vinfo++;
}
}
if (($pinfo) && ($vinfo)) {
last;
}
}
close MOD;
if (($packagename) && (($MODUL{$packagename} eq "??") || (not $MODUL{$packagename})) ) {
if ($version) {
$MODUL{$packagename} = $version;
} else {
$MODUL{$packagename} = "??";
}
}
}
}
Dubu
 2005-01-11 14:47
#4045 #4045
User since
2003-08-04
2145 Artikel
ModeratorIn + EditorIn

user image
Ojeh, ist das mies. (Ja, ja, schon die Zeile "$line = $_;" sollte einen misstrauisch machen, ich geb's zu.)

Da versucht jemand, auf verschiedene Methoden den Modulnamen und die Modulversion herauszubekommen:
1.) Erst mal die Annahme, dass irgendeine Zeile, in der als erstes Wort "package" steht, dahinter den Namen des Packages enthaelt. Das mag ja in den meisten Faellen stimmen, sicher ist das aber nicht. Da nicht mal auf Tabs am Zeilenanfang geprueft wird, kann es umgekehrt sogar sein, dass der Packagename gar nicht gefunden wird.
Urteil: moeglich, aber fehleranfaellig.

2.) Dann wird gesucht nach Versions-Tags von RCS oder CVS, die vielleicht irgendwo stehen. Ziemlich hanebuechen, da diese Versionen dateiweise hochgezaehlt werden und meist ueberhaupt nichts mit der Versionsnummer des Releases zu tun haben.
Urteil: Originell, aber unsinnig.

3.) Als naechstes wird nach Zeilen gesucht, die entweder am Anfang (nach evtl. Whitespace) etwas wie "$VERSION = " oder "$paketname::VERSION =" stehen, oder - da wird es ganz gruselig, irgendwo in der Zeile so etwas wie "Revision: " mit einer Zahl und einem $ dahinter.
Urteil: waghalsig.

Das Ergebnis, was dieser Code als Paketversion ausgibt, kann man optimistisch hoechstens als "gut geraten" bezeichnen. Mit der tatsaechlichen Paketversion - sofern sie ueberhaupt im Paket steht - hat das jedenfalls nicht unbedingt etwas zu tun.

Ein gut geschriebenes Modul benutzt eine Variable $VERSION, die im Namensraum des Paketes definiert ist, s. perlmodstyle. Wie man nun auf halbwegs(!) vernuenftige Weise herausfindet, welche Version ein so geschriebenes Paket hat, ohne das Modul zu laden, kann man sich z.B. in der Routine parse_version() aus ExtUtils::MM_* anschauen. Das ist zwar immer noch nicht perfekt (wuerde z.B. faelschlicherweise auch ein $VERSION innerhalb eines Here-Dokumentes zaehlen), aber gibt sich schon grosse Muehe.\n\n

<!--EDIT|Dubu|1105447696-->
cbxk1xg
 2005-01-11 19:06
#4046 #4046
User since
2003-10-20
496 Artikel
BenutzerIn
[default_avatar]
Kann mal also vieleicht zusamenfassend sagen, dass es keine verlässliche Prozedur gibt um die Version eines Moduls herauszufinden? Ist das etwa nicht standardtisiert? Falls ja, ist das mehr als traurig! :-(
<< |< 1 2 3 >| >> 26 Einträge, 3 Seiten



View all threads created 2005-01-10 09:47.