2009-08-27 5 views
2

Ci-dessous le script que je l'ai écrit pour changer la valeur d'un des paramètres dans un fichier XML situé à un autre emplacement:Pourquoi ai-je une erreur de XML :: SAX :: PurePerl :: EncodingDetect bien que je n'ai pas chargé ce module?

#!/usr/bin/perl -w 

use Cwd; 
use XML::Simple; 
use Data::Dumper; 
no warnings; 

my $before_upgrade_value = &pre_upgrade_value; 
print "Value before upgrade:: $before_upgrade_value \n"; 

&change_value ($before_upgrade_value); 

&change_value ("America"); 

my $after_upgrade_value = &pre_upgrade_value; 

print "Value after upgrade:: $after_upgrade_value \n"; 
print "Done \n"; 

sub pre_upgrade_value { 
    my $xml = new XML::Simple; 

    # read XML file 
    my $input_xml = "/usr/tmp/country/CountryConfig.xml"; 

    my $data = $xml->XMLin($input_xml); 
    my $arg0 = $data->{COMMON}->{COUNTRY_LIST}->{Value}; 

    print "Arg0 is $arg0 \n"; 
    return $arg0; 
} 

sub change_value { 
    my $arg0 = shift; 

    my $arg1 = "ENGLAND"; 

    my $arg2 = "/usr/tmp/country/CountryConfig.xml"; 

    system("perl -pi -e 's/$arg0/$arg1/' $arg2"); 
} 

Mais je reçois l'erreur suivante:

Unable to recognise encoding of this document at /usr/local/lib/perl5/site_perl/5.8.7/XML/SAX/PurePerl/EncodingDetect.pm line 100. Document requires an element [Ln: 1, Col: 0]

Pouvez-vous me dire la raison que je n'appelle pas EncodingDetect.pm dans mon code?

+1

Ne pas utiliser '& pre_upgrade_value' pour appeler' pre_upgrade_value' à moins que vous connaissez quand utiliser '&' et quand ne pas l'utiliser. Utilisez 'pre_upgrade_value()'. Lisez 'perldoc perlsub'. Utilisez 'strict'. Utilisez 'warnings' plutôt que' -w' et essayez 'no warnings'. Évitez la notation d'objet indirect. –

Répondre

7

XML :: SAX est utilisé par XML :: Simple. À partir du code:

# XML::Simple requires the services of another module that knows how to parse 
# XML. If XML::SAX is installed, the default SAX parser will be used, 
# otherwise XML::Parser will be used. 

Une partie de XML :: SAX est XML :: SAX :: :: PurePerl EncodingDetect. Il semble que vous ayez quelques espaces au début de votre XML, vous pouvez trouver ce PerlMonks node utile.

+0

Mais je n'utilise pas XML :: SAX. Au lieu de cela, j'utilise XML: Simple –

+0

J'ai essayé de le rendre plus clair dans la réponse. En utilisant XML :: Simple, vous utilisez XML :: SAX. XML :: Simple est une interface pour XML :: SAX (ou un analyseur différent si XML :: SAX n'est pas installé). –

0

Lorsque vous utilisez un module, vous pouvez également utiliser tous les modules qu'il utilise, et tous les modules qu'ils utilisent, et ... :)

Questions connexes