powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / PHP, Perl, Python [игнор отключен] [закрыт для гостей] / Perl: почему-то не срабатывает exists
4 сообщений из 4, страница 1 из 1
Perl: почему-то не срабатывает exists
    #39375138
Alibek B
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Случайно выявился баг в одном скрипте.
Но причину понять не могу.

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


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