Perl Encode qw/encode decode/ переопределить Encode.pm

Я запрашиваю таблицу "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
...

person Weiyan    schedule 16.02.2011    source источник
comment
После исправления ENCODE в Encode и создания базы данных с фиктивной таблицей я смог запустить программу, но не получаю описанных вами ошибок.   -  person daxim    schedule 16.02.2011


Ответы (1)


Если вы работаете в файловой системе, нечувствительной к регистру (обычно в Windows), useing модуля с неправильным регистром может привести к таким сообщениям.

Краткий ответ: use Encode (...) (обратите внимание на заглавные буквы)

Более длинный ответ: Perl чувствителен к регистру. Когда вы use используете неправильный регистр заглавных букв, require часть задания будет искать ENCODE.pm , загрузите его и сохраните в %INC. Но когда любая другая часть кода затем попытается use под своим именем (для Encode это происходит через цикл Encode->Encode::Alias->Encode), она не найдет его в %INC, загрузит снова и который запускает все эти сообщения переопределения.

Использование предполагаемого имени модуля позволяет избежать этого.

person JB.    schedule 16.02.2011