eval { require } -Rätsel

21/08/2010 - 12:48 von Christian Garbs | Report spam
Mahlzeit!

Ich habe hier Code, der seit Jahren gut funktioniert. Ich prüfe die
Existenz von Modulen über

our ($have_module);
BEGIN {
eval { require Some::Module; };
$have_module = not @_;
}

Das klappt(e) prima.

Nun habe ich das Phànomen, dass der gleiche Code auf meinem Server
funktioniert, auf meinem Laptop aber das definitiv installierte Modul
nicht finden will und außerdem meldet:
"Variable "$have_module" is not available at (eval xx) line yy."

Ich habe beide Systeme verglichen: @INC ist auf beiden Rechnern gleich, md5sum
vom Skript und vom konkret betroffenen Modul (MP3::Info) sind gleich,
es gibt auch jeweils nur genau dieses eine Modul, es kommt also nicht
irgendwo noch eine andere Version aus @INC zum Tragen.

Auf beiden(!) Rechnern schmeißt dieser Test hier keinen Fehler:
$ perl -MMP3::Info -e ''

Woran kann sows liegen?


Perl-Version ist:
This is perl, v5.10.0 built for i486-linux-gnu-thread-multi
aus Debian Lenny:
perl 5.10.0-19lenny2



Ganz konkret ist es das Skript unter [1] und es erzeugt im Fehlerfall
diese Ausgabe (MP4::Info ist wirklich nicht da, die Fehlermeldung ist
ok und da wird dann ja auch keine Variable vermisst; MP3::Info ist
mein Problem):

mitch@ms1067a1:~/git/soundconvert$ ./soundconvert.pl
Variable "$have_mp3_info" is not available at (eval 27) line 23.
AAC unavailable: Perl module MP4::Info not found at ./soundconvert.pl
line 127.
MP3 unavailable: Perl module MP3::Info not found at (eval 27) line 26.
soundconvert 1.43+git

Usage: soundconvert.pl [-h] [-f] [-o format] infile [infile [...]]
-h print help text and exit
-f remove non-FAT characters from output file
(warning: might overwrite existing files!)
-o format choose output format (default: MP3)
available formats are:
flac
ogg
wav
mp3
Available input formats are:
ape flac gbs mid mod mp3 ogg sid wav
One or more DATA sections were not processed by Inline.



Auch die letzte Zeile mit den DATA sections ist komisch.

Die Zeilennummern in der Fehlermeldung passen mir ebenfalls nicht so
richtig... Selbst, wenn ich das BEGIN da weglasse, Zeile 22 mit dem
our (...) komplett entferne und dann allen Variablen ein my
voranstelle, wird das fehlende $have_mp3_info schon in Zeile 23
angemeckert -- obwohl da dann das eval() für Audio::Flac:Header steht
und kein Bezug auf $have_mp3_info.

Und auf dem anderen Rechner funktioniert alles, wie es soll.
Ich versteh hier nur Bahnhof!

Gruß
Christian

[1] http://bit.ly/9VnoKU bzw.
http://www.cgarbs.de/cgi-bin/gitweb...831233698c
sub _{print""}_;for(;$s<9;++$s){$_='1E2018201E00001E2018201E00001E2018201'
.'E002020001C2222221400005CA2A2A27C02001C2222221C20003E040202201F2422221C00'
.'242A2A2A12002020001C2222221F20001C2A2A2A0C';while(s;(..);;){printf'%c',hex
$1&1<<$s?40:32}_}$_=':::Christian Garbs:<mitch@cgarbs.de>',y;:;\t;;print;_;_
 

Lesen sie die antworten

#1 Peter J. Holzer
21/08/2010 - 17:59 | Warnen spam
On 2010-08-21 10:48, Christian Garbs wrote:
Ich habe hier Code, der seit Jahren gut funktioniert. Ich prüfe die
Existenz von Modulen über

our ($have_module);
BEGIN {
eval { require Some::Module; };
$have_module = not @_;


^^ Das da soll wohl $@ heißen. Tippfehler im
Posting oder im Script?
}

Ähnliche fragen