[Moscow.pm] 2 all & 2 ruz

Sergey Homenkow hsw на hsw.pp.ru
Вт Апр 1 12:11:15 PDT 2008


Приветствую!

У самого руки не доходят до подготовки доклада, так что делюсь наработками.

1. http://perldoc.perl.org/Encode.html:
"After $utf8 = decode('foo', $octet); ,

   When $octet is...   The UTF8 flag in $utf8 is
   ---------------------------------------------
   In ASCII only (or EBCDIC only)            OFF"

Проверяем:

#perl -MEncode -e 'print Encode::is_utf8(decode(q{utf-8}, 2+2))'
1

2. С включенным use utf8 perl также нарушает это правило при 
преобразовании текста в скаляр:
- (a => 2) - 'a' - будет с флагом utf (обсуждалось в рассылке)
- $a->{a} - аналогично.

Экзотика:

use utf8;
use Devel::Peek;
my %a = ( 'a' => 1, 'b' => 1 );
Dump(\%a);
delete $a{c};
Dump(\%a);

Первый Dump выводит флаги хеша:
FLAGS = (PADBUSY,PADMY,SHAREKEYS)
а второй уже:
FLAGS = (PADBUSY,PADMY,SHAREKEYS,HASKFLAGS)
теперь все ключи хеша содержат дополнительное поле с флагом.

При Storable у хеша другой тип, дополнительный байт на хеш и по 
дополнительному байту на каждый ключ.

Вернуть назад нельзя (только копированием данных в другую переменную).

3. Cache::Memcached использует Storable для сериализации, а он сохраняет 
  флаг utf8. Главное верить.
Memcached.pm:
sub _set()
...
     if (ref $val) {
         local $Carp::CarpLevel = 2;
         $val = Storable::nfreeze($val);
         $flags |= F_STORABLE;
     }
А для простого скаляра nfreeze() не вызывается.
Строчка записывается как она есть.
При чтении данных из сокета получаем строку без флага utf8.

PS. Тестировал на perl v5.8.8. Некоторое проверял на 5.10.0 - тоже самое.

Vladimir V. Perepelitsa пишет:
> 2 all:
> Если у кого есть глюки или непонятки с utf8, присылайте плиз тесткейсы и 
> вопросы. буду дорабатывать доклад к May Perl



Подробная информация о списке рассылки Moscow-pm