Справка по Perl Regex - PullRequest
       0

Справка по Perl Regex

0 голосов
/ 23 декабря 2010

Я получаю похожую ошибку в двух совершенно не связанных друг с другом местах в нашем коде, которые мы не можем понять, как ее решить.Первая ошибка возникает, когда мы пытаемся проанализировать XML с помощью XML :: Simple :

Malformed UTF-8 character (unexpected end of string) in substitution (s///) at /usr/local/lib/perl5/XML/LibXML/Error.pm line 217.

И вторая, когда мы пытаемся выполнить простую подстановку строк:

Malformed UTF-8 character (unexpected non-continuation byte 0x78, immediately after start byte 0xe9) in substitution (s///) at /gold/content/var/www/alltrails.com/cgi-bin/API/Log.pm line 365.

В нашем файле Log.pm речь идет о следующей строке, где $message - это строка:

$message =~ s/\s+$//g;

Наша самая большая проблема в устранении неполадок заключается в том, что мы не нашли способ идентифицироватьвход, который вызывает это происходит.Я надеюсь, что кто-то еще сталкивался с этой проблемой раньше и может предоставить совет или образец кода, который поможет нам решить ее.

Заранее спасибо за вашу помощь!

Ответы [ 3 ]

3 голосов
/ 23 декабря 2010

Не знаю, в чем причина, но если вы хотите записать сообщение, которое вызывает это, вы всегда можете добавить обработчик сигнала __DIE__, чтобы убедиться, что вы зафиксировали ошибку:

$SIG{__DIE__} = sub { 
  if ($_[0] =~ /Malformed UTF-8 character/) { 
    print STDERR "message = $message\n"; 
  } 
};

Это должно как минимум дать вам знать, какая строка вызывает эти ошибки.

1 голос
/ 23 декабря 2010

Можете ли вы сделать шестнадцатеричный дамп исходных данных, чтобы посмотреть, как они выглядят?

Если вы читаете это из файла, вы можете сделать это с помощью такого инструмента, как "od".

Или вы можете сделать это внутри самого скрипта perl, передав строку в функциюкак это:

sub DumpString {
    my @a = unpack('C*',$_[0]);
    my $o = 0;
    while (@a) {
        my @b = splice @a,0,16;
        my @d = map sprintf("%03d",$_), @b;
        my @x = map sprintf("%02x",$_), @b;
        my $c = substr($_[0],$o,16);
        $c =~ s/[[:^print:]]/ /g;
        printf "%6d %s\n",$o,join(' ',@d);
        print " "x8,join('  ',@x),"\n";
        print " "x9,join('   ',split(//,$c)),"\n";
        $o += 16;
    }
}
0 голосов
/ 23 декабря 2010

Похоже, у вас есть файл "XML", который, как ожидается, будет содержать символы в кодировке UTF-8, но этого не будет.Попробуйте просто открыть его и найти хибитских персонажей.

...