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

Andrei andrei.protasovitski на gmail.com
Чт Ноя 29 01:40:08 PST 2018


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

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/e9e95b16/attachment.html>


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