[Moscow.pm] Interesting behavior of 'delete' function

Alessandro Gorohovski an.gorohovski на gmail.com
Чт Ноя 29 01:53:16 PST 2018


чт, 29 нояб. 2018 г. в 12:40, Andrei <andrei.protasovitski на gmail.com>:

> Давным давно, когда в Perl'е ещё не было ссылок, синтаксис $hash{ 1,2,3,4
> } использовался для создания многомерных массиивов. По сути, 1,2,3,4
> заменяется на строку "1$;2$;3$;4".
>

Да, это всё так и есть, но проблема не в этом.
Наверное я плохо сформулировал проблему в самом начале.

Проблема в том, что в контексте функции *delete* происходит *создание*
*нового* элемента,
а не удаление или, как минимум, игнорирование ошибочного/не существующего
ключа.
Более того это происходит неявно и без предупреждения.
Понимаете.

perldoc perlvar:
>
> $SUBSCRIPT_SEPARATOR
>     $SUBSEP
>     $;      The subscript separator for multidimensional array emulation.
> If
>             you refer to a hash element as
>
>                 $foo{$x,$y,$z}
>
>             it really means
>
>                 $foo{join($;, $x, $y, $z)}
>
>             But don't put
>
>                 @foo{$x,$y,$z}      # a slice--note the @
>
>             which means
>
>                 ($foo{$x},$foo{$y},$foo{$z})
>
>             Default is "\034", the same as SUBSEP in awk. If your keys
>             contain binary data there might not be any safe value for $;.
>
>             Consider using "real" multidimensional arrays as described in
>             perllol.
>
>             Mnemonic: comma (the syntactic subscript separator) is a
>             semi-semicolon.
>
>
> ср, 28 нояб. 2018 г. в 20:05, Alessandro Gorohovski via Moscow-pm <
> moscow-pm на pm.org>:
>
>> Приветствую Уважаемое Perl-сообщество,
>>
>> Возможно это покажется тривиальным/хорошо известным поведением
>> функции delete применительно к хешам, но оставлю на всякий случай.
>>
>> Итак имеется хеш %a:
>> print Dumper \%a;
>> $VAR1 = {
>>           '11' => {
>>                     '24' => {
>>                               '31' => 41
>>                             },
>>                     '23' => {
>>                               '33' => 43
>>                             },
>>                     '22' => {
>>                               '32' => 42
>>                             },
>>                     '21' => {
>>                               '31' => 41
>>                             }
>>                   }
>>         };
>> из которого надо удалить, к примеру несколько внутренних элементов,
>> например: $a{11}{21}{31} и $a{11}{24}{31}
>> Выполняем :
>>   delete $a{11}{21,24}{31}
>>
>> но удаления не происходит :(
>> а добавляется новый внутренний загадасный элемент:
>>
>> print Dumper \%a;
>> $VAR1 = {
>>           '11' => {
>>                     '23' => {
>>                               '33' => 43
>>                             },
>>                     '22' => {
>>                               '32' => 42
>>                             },
>>                     '21' => {
>>                               '31' => 41
>>                             },
>>                     '24' => {
>>                               '31' => 41
>>                             },
>>                     '21 24' => {}
>>                   }
>>         };
>>
>> Или например так:
>> delete $a{11}{keys %{$a{11} } }{31}
>>
>> Опять добавляется новый элемент.
>>
>> print Dumper \%a;
>> $VAR1 = {
>>           '11' => {
>>                     '5' => {},
>>                     '21' => {
>>                               '31' => 41
>>                             },
>>                     '23' => {
>>                               '33' => 43
>>                             },
>>                     '22' => {
>>                               '32' => 42
>>                             },
>>                     '21 24' => {},
>>                     '24' => {
>>                               '31' => 41
>>                             }
>>                   }
>>         };
>>
>> Как вы думаете в чём причина такого поведения delete
>> ?
>>
>> С уважением,
>> Александр.
>>
>> --
>> Moscow.pm mailing list
>> moscow-pm на pm.org | http://moscow.pm.org
>>
>
>
> --
> Andrei Protasovitski
> < andrei[dot]protasovitski[at]gmail[dot]com >
> Diemen, Netherlands
>
----------- следующая часть -----------
Вложение в формате HTML было извлечено…
URL: <http://mail.pm.org/pipermail/moscow-pm/attachments/20181129/f48cd766/attachment.html>


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