Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / PHP, Perl, Python [игнор отключен] [закрыт для гостей] / Perl: почему-то не срабатывает exists / 4 сообщений из 4, страница 1 из 1
26.12.2016, 11:36
    #39375138
Alibek B
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Perl: почему-то не срабатывает exists
Случайно выявился баг в одном скрипте.
Но причину понять не могу.

В скрипте есть такой фрагмент:
Код: php
1.
2.
$idx->{'channel'} = {map {$_->{'id'} => ($_->{'name'} =~ m/^(CAM-[-0-9]+)/)} grep {$_->{'name'} =~ m/^(CAM-[-0-9]+)/} @{$cache->{'media'}}};
$key->{'channel'} = {map {$idx->{'channel'}->{$_} => $_} keys(%{$idx->{'channel'}})};


$cache это исходные данные, а $idx и $key вспомогательные хеши для быстрого поиска по идентификатору и по названию соответственно.

Затем далее в скрипте идет заполнение пользовательских данных:
Код: php
1.
$usr->{'_CHANNEL_LIST'} = [sort map {$key->{'channel'}->{$_}} grep {exists($key->{'channel'}->{$_})} (keys %{$usr->{'_CHANNEL'}})];


Но в получаемом наборе почему-то отсутствует одна строка.

Сделал отладочный вывод:
Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
if ($login eq '101-3654')
{
        my $tmp = {map {$_->{'id'} => ($_->{'name'} =~ m/^(CAM-[-0-9]+)/)} grep {$_->{'name'} =~ m/^(CAM-30[0-9]+)/} @{$cache->{'media'}}};
        print Dumper($tmp);
        $tmp = {map {$tmp->{$_} => $_} keys(%$tmp)};
        print Dumper($tmp);
        print Dumper($key->{'channel'}->{'CAM-302'});
        foreach my $ch (keys %{$usr->{'_CHANNEL'}})
        {
                print "*dbg* _CHANNEL [$ch] *\n";
                print "*dbg* -- exists = " . (exists($key->{'channel'}->{$ch}) ? "1" : "0") . " *\n";
        }
}


Результат такой:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
{
  '35389' => 'CAM-306',
  '35386' => 'CAM-303',
  '35391' => 'CAM-308',
  '35387' => 'CAM-304',
  '35392' => 'CAM-309',
  '35390' => 'CAM-307',
  '35384' => 'CAM-301',
  '35388' => 'CAM-305',
  '35385' => 'CAM-302'
}
{
  'CAM-301' => 35384,
  'CAM-307' => 35390,
  'CAM-306' => 35389,
  'CAM-302' => 35385,
  'CAM-305' => 35388,
  'CAM-308' => 35391,
  'CAM-309' => 35392,
  'CAM-304' => 35387,
  'CAM-303' => 35386
}
35385  <-- Dumper($key->{'channel'}->{'CAM-302'})
*dbg* _CHANNEL [CAM-309] *
*dbg* -- exists = 1 *
*dbg* _CHANNEL [CAM-304] *
*dbg* -- exists = 1 *
*dbg* _CHANNEL [CAM-302] *
*dbg* -- exists = 0 *  <-- (exists($key->{'channel'}->{$ch}) ? "1" : "0")
*dbg* _CHANNEL [CAM-308] *
*dbg* -- exists = 1 *
*dbg* _CHANNEL [CAM-303] *
*dbg* -- exists = 1 *

Не могу понять, почему для CAM-302 exists дает false.
________________________
Мы смотрим с оптимизмом...
...в оптический прицел.
...
Рейтинг: 0 / 0
26.12.2016, 11:44
    #39375146
Alibek B
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Perl: почему-то не срабатывает exists
Добавил в отладочный вывод такую строку:
Код: php
1.
print "*dbg* -- compare [$ch] and 'CAM-302' = " . (($ch eq 'CAM-302') ? "1" : "0") . " *\n";


Получил еще более непонятный результат:
Код: plaintext
*dbg* -- compare [CAM-302] and 'CAM-302' = 0 *
Сохранил в файл, просмотрел в hex-режиме — они одинаковые.
...
Рейтинг: 0 / 0
26.12.2016, 12:19
    #39375177
Alibek B
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Perl: почему-то не срабатывает exists
Добавил вывод содержимого переменной через unpack.
Получил такой результат:
Код: plaintext
1.
2.
*dbg* -- unpack($ch) = 9d43414d2d333032 *
*dbg* -- unpack('CAM-302') = 43414d2d333032 *
Откуда мог взяться символ 0x9d понятия не имею, в исходных данных его нет.
И почему он не выводится в юникодную консоль тоже непонятно.
Но хотя бы понятно, что искать.
...
Рейтинг: 0 / 0
26.12.2016, 12:38
    #39375196
Alibek B
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Perl: почему-то не срабатывает exists
Вообщем топик можно закрывать, с причиной разобрался.
В БД пользователи как-то смогли внести BOM (скорее всего через буфер обмена), который визуально нигде не отображался, а в Perl почему-то попадал как 0x9d, и тоже визуально не отображался.
...
Рейтинг: 0 / 0
Форумы / PHP, Perl, Python [игнор отключен] [закрыт для гостей] / Perl: почему-то не срабатывает exists / 4 сообщений из 4, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]