perl编码qw /编码解码/重新定义Encode.pm

时间:2011-02-16 12:54:48

标签: perl utf-8 encode big5

我正在查询表“帖子”;它的字段用户名和内容是utf8 chinese。我需要将它们转换为big5才能在Windows控制台中打印。我的脚本无法编译,报告了重新定义ENCODE例程的错误。

我有另一个脚本来测试没有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
...

1 个答案:

答案 0 :(得分:3)

如果您使用不区分大小写的文件系统(通常在Windows上),{{1}使用错误案例的模块可能会导致此类消息。

简短回答:use(注意大写)

更长的答案:Perl区分大小写。当use模块使用错误的大小写时,作业的use Encode (...)部分会搜索require,加载并将其存储在ENCODE.pm中。但是,当代码的任何其他部分尝试%INC以其专有名称use时,这会通过Encode - > Encode - > { {1}}循环),它不会在Encode::Alias中找到它,会再次加载它,并触发所有这些重定义消息。

使用预期的模块名称可以避免这种情况。