powered by simpleCommunicator - 2.0.40     © 2025 Programmizd 02
Форумы / PHP, Perl, Python [игнор отключен] [закрыт для гостей] / Perl v5.14.2 - cтранный глюк?
5 сообщений из 5, страница 1 из 1
Perl v5.14.2 - cтранный глюк?
    #39837059
Alibek B
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Допустим у меня в цикле используется такой фрагмент:
Код: php
1.
my $user = $item->{'user'} if exists($item->{'user'});


В моем представлении в $user должно оказаться значение $item->{'user'}, если оно существует, или undef, если такого значения не существует.
В минимальном примере у меня так и получается:
Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
my @items;
push @items, {'id'=>1, 'name'=>'item1', 'user'=>'user1', 'group'=>'group1'                 };
push @items, {'id'=>2, 'name'=>'item2', 'user'=>'user2'                                    };
push @items, {'id'=>3, 'name'=>'item3', 'user'=>undef,   'group'=>'group3', 'flag'=>'flag3'};
push @items, {'id'=>4, 'name'=>'item4', 'user'=>'user4', 'group'=>undef   , 'flag'=>'flag4'};
push @items, {'id'=>5, 'name'=>'item5',                  'group'=>'group5'                 };
push @items, {'id'=>6, 'name'=>'item6',                                   , 'flag'=>undef  };
push @items, {'id'=>7, 'name'=>'item7', 'user'=>'user7', 'group'=>'group7', 'flag'=>'flag7'};
push @items, {'id'=>8, 'name'=>'item8', 'user'=>'user8'                                    };

$Data::Dumper::Indent = 0;
print Dumper($_) . "\n" foreach(@items);
foreach my $item (@items)
{
        my $id = $item->{'id'};
        my $user = $item->{'user'}   if (exists $item->{'user'});
        my $group = $item->{'group'} if (exists $item->{'group'});
        my $flag = $item->{'flag'}   if (defined $item->{'flag'});
        print "#$id, user=" . ($user||'-----') . ", group=" . ($group||'------') . ", flag=" . ($flag||'----') . "\n";
}



Но в более сложном скрипте я сталкивался с тем, что в переменной оказывается значение с прошлой итерации цикла.
Код: php
1.
2.
3.
4.
5.
foreach my $row (values %$data)
{
	my $sub = (exists($row->{'TMS'})) ? $row->{'TMS'} : {};
	my $pkg = $row->{'TMS.PACKAGES'} if (exists($row->{'TMS.PACKAGES'}));
print Dumper($pkg, $row);


В $row нет элемента 'TMS.PACKAGES', но в $pkg задано значение.
Из-за чего такое может происходить?
...
Рейтинг: 0 / 0
Perl v5.14.2 - cтранный глюк?
    #39838970
Alibek B
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кажется локализовал проблему.

Код: php
1.
2.
3.
4.
my $cache = {'11'=>{'id'=>'11', 'name'=>'aa'}};
my $row = (1 ? $cache->{'11'} : $cache->{'22'} = {'flag'=>'test'});
print Dumper($row);
print Dumper($cache);


В этом примере почему-то изменяется $cache, условие внутри тернарного оператора истинно.
Если внутри тернарного оператора выражения заключить с скобки, тогда всегда нормально.
Код: php
1.
2.
3.
4.
my $cache = {'11'=>{'id'=>'11', 'name'=>'aa'}};
my $row = (1 ? ($cache->{'11'}) : ($cache->{'22'} = {'flag'=>'test'}));
print Dumper($row);
print Dumper($cache);



Это баг? Или какие-то особенности, которые я не учитываю?
...
Рейтинг: 0 / 0
Perl v5.14.2 - cтранный глюк?
    #39838975
vkle
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Могу ошибаться, возможно, к ошибке приводит дефолтовый приоритет выполнения операторов.
Скобками приоритеты расставлены явным образом. Ну и код чуть лучше читается.
...
Рейтинг: 0 / 0
Perl v5.14.2 - cтранный глюк?
    #39838994
Alibek B
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А какого именно оператора?
Я считал, что "?:" это не оператор, а синтаксическая структура.
А больше там операторов с неоднозначным приоритетом и нет.
...
Рейтинг: 0 / 0
Perl v5.14.2 - cтранный глюк?
    #39838995
Alibek B
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Хотя нет.
Видимо без скобок PHP строку понимает так:
Код: php
1.
(1 ? $cache->{'11'} : $cache->{'22'}) = {'flag'=>'test'}
...
Рейтинг: 0 / 0
5 сообщений из 5, страница 1 из 1
Форумы / PHP, Perl, Python [игнор отключен] [закрыт для гостей] / Perl v5.14.2 - cтранный глюк?
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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