perl Encode qw / encode decode / redefined Encode.pm - PullRequest
0 голосов
/ 16 февраля 2011

я запрашиваю таблицу "пост"; его поля username и content являются 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
...

1 Ответ

3 голосов
/ 16 февраля 2011

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

Краткий ответ: use Encode (...) (примечаниекапитализация)

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

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

...