Fehlersuche

Hallo,

ich versuche gerade, in einem Perl-Skript, das ich nicht selber
geschrieben habe, ein paar Erweiterungen anzubringen. Zum Skript
gehören einige (undokumentierte) Perl-Module, und eine der Funktionen,
die von Tpm.pm *nicht* exportiert werden, schien mir genau richtig zu
sein, um mein Problem zu lösen.

Leider klappt es nur halb, sprich, nicht "reproduzierbar". Wenn ich
dieses Tpm.pm verstanden hätte (und dazu auch die objektorientierten
Perl-Features wirklich begriffen hätte), wüßte ich sicher, warum, und
bräuchte hier nicht mehr fragen.

Am liebsten würde ich nun mein Problem lösen und dabei etwas über
Problemlösestrategien lernen, und natürlich über den ganz konkreten
Fehler, den ich gemacht habe. Aber wenn es geht, möchte ich gerne
vermeiden, das ganze Modul Tpm.pm zu verstehen.


Die wesentliche von mir geschriebene Funktion sieht so aus:

sub printFiles {
my ($pkgcat, $LocalTPM)= [at] _;
my $pkg_header = "% $pkgcat";
my $dom_parser = new XML::DOM::Parser;
my $doc = $dom_parser->parsefile($LocalTPM);
my %SourceFiles = &Tpm::getListField($doc, "SourceFiles");
print $pkg_header . "\n";
print $SourceFiles{text} . "\n";
}

und die getListField-Subroutine in Tpm.pm so:

sub getListField {
my ($doc, $f) = [at] _;

my %s = getTextField($doc, $f);
my $str = "";
if (defined($s{"text"})) {
$str = $s{"text"};
}
$str =~ s/^\n*//;
$str =~ s/\n*$//;
$str =~ s/\n/ /gomsx;
[at] {$s{"text"}} = split(" ", $str);
return %s;
}

Die Ausgabe des Programms ist nun für drei verschiedene Werte von
$LocalTPM:

,----
| % fontinst
| ARRAY(0x86463c4)
| % wasysym
|
| texmf-dist/source/latex/wasysym/wasysym.dtx
| texmf-dist/source/latex/wasysym/wasysym.ins
|
| % xkeyval
| texmf-dist/source/latex/xkeyval/xkeyval.dtx
`----

Beim letzten wird also die einzige Datei korrekt ausgegeben, beim
vorletzten kommt eine Leerzeile davor, und beim ersten kommt gleich
Datenmüll. Das sieht nicht gut aus, irgendwas habe ich da ziemlich
falsch gemacht... Die LocalTPM-Dateien schauen natürlich gleich aus -
bei fontinst sollten allerdings gleich 21 Dateien ausgegeben werden:

<!DOCTYPE rdf:RDF SYSTEM "../../Tools/tpm.dtd">
<rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:TPM="http://texlive.dante.de/">
<rdf:Description about="http://texlive.dante.de/texlive/Package/wasysym.zip">
<TPM:Name>wasysym</TPM:Name>
[...]
<TPM:SourceFiles size="28446">
texmf-dist/source/latex/wasysym/wasysym.dtx
texmf-dist/source/latex/wasysym/wasysym.ins
</TPM:SourceFiles>
<TPM:Provides>Package/wasysym</TPM:Provides>
</rdf:Description>
</rdf:RDF>


Was müsste ich nun tun oder lesen, um weiterzukommen?


Das ganze Skript in der von mir veränderten Form kann man unter
http://svn.debian.org/wsvn/debian-tex/tetex-base/trunk/debia n/tpm2licenses-new.pl?op=file&rev=0&sc=0
bestaunen, die Module liegen in
http://svn.debian.org/wsvn/debian-tex/texlive/trunk/LocalTPM /Tools/?rev=0&sc=0.
Funktionieren tut das ganze allerdings nur, wenn man nicht nur von
diesen SVN-Trees einen Checkout hat, sondern auch noch vom texcatalogue
auf Sarovar...

TIA, Frank

--
> ich wusste mal einen Befehl, der die Ausgabe auf stdout noch zusätzlich
> in eine Datei umlenken konnte... Bitte helft mir auf die Sprünge.
"kaffee" war es nicht.
frank [ Sa, 04 März 2006 21:16 ] [ ID #1214917 ]

Re: Fehlersuche

Frank Küster <frank [at] kuesterei.ch> writes:

> Hallo,
>
> ich versuche gerade, in einem Perl-Skript, das ich nicht selber
> geschrieben habe, ein paar Erweiterungen anzubringen. Zum Skript
> gehören einige (undokumentierte) Perl-Module, und eine der Funktionen,
> die von Tpm.pm *nicht* exportiert werden, schien mir genau richtig zu
> sein, um mein Problem zu lösen.
>
> Leider klappt es nur halb, sprich, nicht "reproduzierbar". Wenn ich
> dieses Tpm.pm verstanden hätte (und dazu auch die objektorientierten
> Perl-Features wirklich begriffen hätte), wüßte ich sicher, warum, und
> bräuchte hier nicht mehr fragen.
>
> Am liebsten würde ich nun mein Problem lösen und dabei etwas über
> Problemlösestrategien lernen, und natürlich über den ganz konkreten
> Fehler, den ich gemacht habe. Aber wenn es geht, möchte ich gerne
> vermeiden, das ganze Modul Tpm.pm zu verstehen.
>

Zum Debuggen von komplexen Datenstrukturen empfehle ich Data::Dumper:

use Data::Dumper;
warn Dumper \%SourceFiles;

Dann weißt du wenigstens, wie die Variable aufgebaut sein kann.

Gruß,
Slaven

--
Slaven Rezic - slaven <at> rezic <dot> de
Tired of using file selectors? Real programmers use the TAB key for
completion and not for jumping around. Try
http://search.cpan.org/search?mode=module&query=Tk::PathEntr y
Slaven Rezic [ So, 05 März 2006 12:19 ] [ ID #1215774 ]

Re: Fehlersuche

Slaven Rezic <slaven [at] rezic.de> wrote:

> Zum Debuggen von komplexen Datenstrukturen empfehle ich Data::Dumper:
>
> use Data::Dumper;
> warn Dumper \%SourceFiles;
>
> Dann weißt du wenigstens, wie die Variable aufgebaut sein kann.

Dankeschön - es war ein ganz blöder Fipptehler...

Gruß, Frank
--
> ich wusste mal einen Befehl, der die Ausgabe auf stdout noch zusätzlich
> in eine Datei umlenken konnte... Bitte helft mir auf die Sprünge.
"kaffee" war es nicht.
frank [ Mo, 06 März 2006 02:14 ] [ ID #1217250 ]
Perl » de.comp.lang.perl.misc » Fehlersuche

Vorheriges Thema: Warum wird der Task run einmal ausgefürt?
Nächstes Thema: Pipeline bauen?