Thread Infomeldung bei Aufruf des Skripts über die Konsole (5 answers)
Opened by Neyt at 2013-06-12 07:53

topeg
 2013-06-12 11:34
#168108 #168108
User since
2006-07-10
2611 Artikel
BenutzerIn

user image
Der Code Ausschnitt hat ein paar Probleme.

Als Erstes: if( defined glob($options{output}). Das ist immer wahr. Da 0 und "" keine vernünftigen Namen für XML-Dateien sind , sollte man schreiben:
if( glob($options{output} ) Damit wäre dein Hauptproblem gelöst, da undef 0 und "" ausgeschlossen werden.

Als Zweites:
Code (perl): (dl )
1
2
3
        $xmlFile = glob($options{output}); 

        $dumperFile = "$xmlFile.dmp";
Das deutet darauf hin das kein use strict; verwendet wird. So definiert sind die Variablen global. Das bedeutet eventuell vorhandene werte in diesen variablen werden hier überschrieben. das kann zu seltsamen Verhaltensweisen des Scripts führen. Sofern das keine Absicht ist (und es sieht mir nicht danach aus) sollten diese Variablen lokal defineirt werden:
Code (perl): (dl )
1
2
3
        my $xmlFile = glob($options{output}); 

        my $dumperFile = "$xmlFile.dmp";


Und als Drittes:
Code (perl): (dl )
1
2
3
4
5
6
7
8
        open( my $fh_out, '>', $xmlFile ) or warn "WARNING: Could not Open *$xmlFile*\n";
        open( my $fh_out_dmp, '>', $dumperFile ) or warn "WARNING: Could not Open *$dumperFile*\n";

        print $fh_out $xml;
        print $fh_out_dmp Dumper $rhDiffResult;

        close $fh_out;
        close $fh_out_dmp;
Hier wird auch wenn das öffnen der Datei fehlschlägt versucht den Datei Inhalt zu schreiben. Da es darüber keine Fehlermeldung gibt weist darauf hin, dass kein use warnings; im Script benutzt wird. Das ist bei größeren Scripten aber definitiv von Vorteil. Da damit viel leichter Fehler gefunden werden können. Besser man schreibt die Stelle so:
Code (perl): (dl )
1
2
3
4
5
6
7
8
9
        if(open my $fh, '>', $xmlFile )
        { print $fh $xml; }
        else 
        { warn "WARNING: Could not Open *$xmlFile* ($!)\n"; }

        if(open my $fh, '>', $dumperFile )
        { print $fh Dumper $rhDiffResult; }
        else
        { warn "WARNING: Could not Open *$dumperFile* ($!)\n"; }
Außerdem sollte man auch Ausgeben warum das öffnen nicht funktioniert hat. Das macht das $! in der Warnung.


Der vollständig Code sollte besser so sein:
Code (perl): (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
    if( glob($options{output}) )
    {
        my $xmlFile = glob($options{output}); 
        my $dumperFile = "$xmlFile.dmp";

        print "\nINFO: Because of some problems with reading the xml file, a hashdump is also performed\n";
        print "      Name of the dumped hash is: '$dumperFile'\n";

        my $xml = $xs->XMLout($rhDiffResult, KeepRoot=>1, NoAttr=>1, AttrIndent => 1 , KeyAttr=>[]);

        if(open my $fh, '>', $xmlFile )
        { print $fh $xml; }
        else
        { warn "WARNING: Could not Open *$xmlFile* ($!)\n"; }

        if(open my $fh, '>', $dumperFile )
        { print $fh Dumper $rhDiffResult; }
        else
        { warn "WARNING: Could not Open *$dumperFile* ($!)\n"; }
    }
    else
    {
        my $xml = $xs->XMLout($rhDiffResult, KeepRoot=>1, NoAttr=>1, AttrIndent => 1, KeyAttr => [] );
        #$xs->XMLin( $xmlFile, KeepRoot => 1, NormaliseSpace => 1, ForceContent => 1, ForceArray => 1, KeyAttr => [] );
        print $xml;
    }

Last edited: 2013-06-12 11:35:35 +0200 (CEST)

View full thread Infomeldung bei Aufruf des Skripts über die Konsole