Perl: ошибка "Wide character in null operation"

Модератор: Модераторы разделов

Аватара пользователя
LXj
Сообщения: 94

Perl: ошибка "Wide character in null operation"

Сообщение LXj »

Извините, если спрашиваю что-то глупое: я никогда раньше с Перлом не работал (разве что книжку когда-то листал), а сегодня понадобилось поправить один скрипт, и тут я обнаружил, что он абсолютно не работает с русскими строками. выдавая ошибку Wide character in null operation at /home/lx/bin/mpd-dynamic line 74

Собственно, в строке 74 проверяется существование элемента хэш-таблицы:

Код: Выделить всё

        if (!exists $ratings{$random}) {


Здесь $random — это имя файла, и указанная выше ошибка выскакивает всегда, когда это имя содержит русские символы

Я копался в гугле по поводу этой проблемы, но так ни к чему хорошему и не пришёл.
Спасибо сказали:
Аватара пользователя
sash-kan
Администратор
Сообщения: 13939
Статус: oel ngati kameie
ОС: GNU

Re: Perl: ошибка "Wide character in null operation"

Сообщение sash-kan »

unicode?
попробуйте передать perl-у параметр -C
Писать безграмотно - значит посягать на время людей, к которым мы адресуемся, а потому совершенно недопустимо в правильно организованном обществе. © Щерба Л. В., 1957
при сбоях форума см.блог
Спасибо сказали:
Аватара пользователя
LXj
Сообщения: 94

Re: Perl: ошибка "Wide character in null operation"

Сообщение LXj »

Та же ошибка
Спасибо сказали:
Аватара пользователя
sash-kan
Администратор
Сообщения: 13939
Статус: oel ngati kameie
ОС: GNU

Re: Perl: ошибка "Wide character in null operation"

Сообщение sash-kan »

Shell

~$ echo $LANG ru_RU.UTF-8 ~$ cat /tmp/1 #!/usr/bin/perl $a = "ю"; $b = "ю"; $r{$a} = 1; if (exists $r{$b}) {print "$b $r{$b}\n"}; ~$ perl /tmp/1 ю 1 ~$ perl --version This is perl, v5.8.8 built for i486-linux-gnu-thread-multi Copyright 1987-2006, Larry Wall Perl may be copied only under the terms of either the Artistic License or the GNU General Public License, which may be found in the Perl 5 source kit. Complete documentation for Perl, including FAQ lists, should be found on this system using "man perl" or "perldoc perl". If you have access to the Internet, point your browser at http://www.perl.org/, the Perl Home Page.

может быть все-таки проблема с самой строкой в $random?
print $random, "=", unpack("H*",$random), "\n"
Писать безграмотно - значит посягать на время людей, к которым мы адресуемся, а потому совершенно недопустимо в правильно организованном обществе. © Щерба Л. В., 1957
при сбоях форума см.блог
Спасибо сказали:
Аватара пользователя
LXj
Сообщения: 94

Re: Perl: ошибка "Wide character in null operation"

Сообщение LXj »

Хм, аналогичный ~/tmp/1 скрипт у меня работает нормально.

Строка в $random при print $random выводится правильно, но с предупреждением. Т.е. если я перед "if (!exists $ratings{$random})" вставлю print "$random."\n";", то получится что-то вроде

Код: Выделить всё

Wide character in print at /home/lx/bin/mpd-dynamic line 71.
ДДТ/1999 - Мир номер ноль/02 Одноразовая жизнь.mp3
Wide character in null operation at /home/lx/bin/mpd-dynamic line 74.


Собственно, строчка в $random попадает вот так:

Код: Выделить всё

use Audio::MPD;
# ....
my $mpd = Audio::MPD->new;
my @files = $mpd->collection->all_pathes;
# ....
            my $random = $files[ rand @files ];


А правлю я вот этот скрипт: http://search.cpan.org/src/JQUELIN/Audio-M...bin/mpd-dynamic
Спасибо сказали:
Аватара пользователя
sash-kan
Администратор
Сообщения: 13939
Статус: oel ngati kameie
ОС: GNU

Re: Perl: ошибка "Wide character in null operation"

Сообщение sash-kan »

ну, попробуйте повсобачивать чего-нибудь типа
use encoding 'utf8';
use open ':utf8';

в частности, и в Audio::MPD

p.s. или уберите use strict ;)
Писать безграмотно - значит посягать на время людей, к которым мы адресуемся, а потому совершенно недопустимо в правильно организованном обществе. © Щерба Л. В., 1957
при сбоях форума см.блог
Спасибо сказали:
Аватара пользователя
LXj
Сообщения: 94

Re: Perl: ошибка "Wide character in null operation"

Сообщение LXj »

use encoding 'utf8';
use open ':utf8';
Если присобачить в скрипт -- Cannot decode string with wide characters at /usr/lib/perl5/5.8.8/i586-linux/Encode.pm line 166, <GEN1> line 243

Если в Audio::MPD -- всё по-старому

p.s. или уберите use strict
Никакого эффекта
Спасибо сказали:
Аватара пользователя
ояб
Сообщения: 107
ОС: FreeBSD

Re: Perl: ошибка "Wide character in null operation"

Сообщение ояб »

use encoding "utf8";
use utf8;
Спасибо сказали:
Аватара пользователя
ояб
Сообщения: 107
ОС: FreeBSD

Re: Perl: ошибка "Wide character in null operation"

Сообщение ояб »

use encoding "utf8";
use utf8;
Спасибо сказали:
Аватара пользователя
LXj
Сообщения: 94

Re: Perl: ошибка "Wide character in null operation"

Сообщение LXj »

use encoding "utf8";
use utf8;

Cannot decode string with wide characters at /usr/lib/perl5/5.8.8/i586-linux/Encode.pm line 166, <GEN1> line 241.
Спасибо сказали:
Аватара пользователя
ояб
Сообщения: 107
ОС: FreeBSD

Re: Perl: ошибка "Wide character in null operation"

Сообщение ояб »

Покажи свой скрипт, уже исправленный. В http://search.cpan.org/src/JQUELIN/Audio-M...bin/mpd-dynamic нет строчки if (!exists $ratings{$random}) {
Спасибо сказали:
Аватара пользователя
LXj
Сообщения: 94

Re: Perl: ошибка "Wide character in null operation"

Сообщение LXj »

Если я запускаю оригинальный скрипт, то он точно также вылетает на 71-й строке (Wide character in null operation):

Код: Выделить всё

            if ( $istied && exists $ratings{$random}
                 && $ratings{$random} != 0
                 && $ratings{$random} < $ARGV{min} ) {
                debug("rating too low: $ratings{$random} [$random]\n");
                redo PICK_ONE;
Спасибо сказали: