2011-02-16 6 views
0

"post"테이블을 쿼리하고 있습니다. 해당 필드의 사용자 이름과 내용은 utf8 중국어입니다. Windows 콘솔에서 인쇄하려면 big5로 변환해야합니다. 내 스크립트가 컴파일되지 않아 ENCODE 루틴이 다시 정의된다는 오류가보고됩니다.perl 인 코드 qw/인 코드 디코드/다시 정의 Encode.pm

DBI를 사용하지 않고 인코딩/디코딩을 테스트 할 다른 스크립트가 있는데 제대로 작동합니다. 어떻게 해결할 수 있습니까?

스크립트 :

use DBI; 
use strict; 
use ENCODE qw /encode decode/; 

my $dbh = DBI->connect("dbi:SQLite:dbname=tweetylicious.db","","",{sqlite_unicode => 1}); 
$dbh->do("PRAGMA foreign_keys = ON"); 

my $result_aref = $dbh->selectall_arrayref("SELECT * FROM post"); 

foreach my $user (@$result_aref) { 
    my $name = ${$user}[1]; 
    my $content = ${$user}[2]; 
    print encode("utf8", $name), " : ",$content, "\n"; 
} 

오류 :

subroutine DEBUG redefined at path-to-lib/ENCODE.pm line 144 
subroutine encoding redefined at path-to-lib/ENCODE.pm line 164 
... 
+0

'ENCODE'를'Encode'로 수정하고 더미 테이블로 데이터베이스를 생성 한 후에는 프로그램을 실행할 수 있었지만 설명 된 오류가 발생하지 않았습니다. – daxim

답변

3
당신이 (Windows에서 일반적으로) 대소 문자를 구분하지 않는 파일 시스템에있는 경우

, use 잘못된 경우에 모듈을 보내고 있습니다 그러한 메시지를 이끌어 낸다.

짧은 답변 : use Encode (...) (대소 문자주의)

긴 대답 : 펄은 대소 문자를 구분합니다. use 모듈에서 잘못된 대소 문자를 사용하는 경우 require 부분은 ENCODE.pm을 찾아로드하고 %INC에 저장합니다. 그러나 코드의 다른 부분이 인 경우 해당 이름으로 use을 시도하면 Encode ->Encode::Alias ->Encode 루프가 발생하고 %INC에서 찾지 않고 다시로드합니다. 모든 재정의 메시지를 트리거합니다.

의도 한 모듈 이름을 사용하면이를 방지 할 수 있습니다.