2009-08-27 4 views
2

は、私は別の場所に位置するXMLファイル内のパラメータのいずれかの値を変更するために書かれているスクリプトです:XML :: SAX :: PurePerl :: EncodingDetectからエラーが発生するのはなぜですか?私はそのモジュールをロードしませんでしたか?以下

#!/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"); 
} 

しかし、私は次のエラーを取得しています:

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]

私のコードでEncodingDetect.pmを呼び出さない理由を教えてください。

+1

を使用いつ '&'を使うべきか、それを使用しない場合。 'pre_upgrade_value()'を使ってください。 'perldoc perlsub'を読んでください。 'strict'を使います。 '-w'ではなく' warnings'を使い、 'no warnings'を試してみてください。間接的なオブジェクト記法を避けてください。 –

答えて

7

XML :: SAXはXML :: Simpleによって使用されます。コードから:

# 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. 

XML :: SAXの一部はXML :: SAX :: PurePerl :: EncodingDetectです。 XMLの先頭に空白があるようですが、PerlMonks nodeが役に立ちます。

+0

しかし、私はXML :: SAXを使用していません。代わりに私はXMLを使用しています:シンプル –

+0

私は答えでより明確にしようとしました。 XML :: Simpleを使用すると、XML :: SAXを使用しています。 XML :: SimpleはXML :: SAX(または、XML :: SAXがインストールされていない場合は別のパーサ)のフロントエンドです。 –

0

あなたはモジュールを使用すると、あなたも、あなたが知っている限り、 `pre_upgrade_value`を呼び出すために`&pre_upgrade_value`使用しないでください、それが使用するすべてのモジュール、および彼らが使用するすべてのモジュール、および... :)