【问题标题】:perl Encode qw/encode decode/ redefined Encode.pmperl Encode qw/encode decode/ 重新定义 Encode.pm
【发布时间】:2011-06-28 08:23:40
【问题描述】:

我正在查询表“post”;它的字段用户名和内容是utf8中文。我需要将它们转换为 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
...

【问题讨论】:

  • 在将ENCODE 修复为Encode 并使用虚拟表创建数据库后,我能够运行该程序,但没有收到您描述的错误。

标签: perl utf-8 encode big5


【解决方案1】:

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

简答:use Encode (...)(注意大写)

更长的答案:Perl 区分大小写。当你use一个模块使用了错误的大小写,require部分的工作将寻找ENCODE.pm,加载它并将它存储在%INC中。但是,当代码的任何其他部分尝试使用其正确名称 use 时(对于 Encode,这是通过 Encode->Encode::Alias->Encode 循环发生的),它不会找到它在%INC 中,将再次加载它,并触发所有这些重新定义消息。

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

【讨论】:

    猜你喜欢
    • 2013-10-29
    • 2015-03-27
    • 1970-01-01
    • 2016-03-02
    • 1970-01-01
    • 2015-09-06
    • 1970-01-01
    • 2016-02-24
    • 2018-08-08
    相关资源
    最近更新 更多