From an.gorohovski на gmail.com Wed Nov 28 11:04:41 2018 From: an.gorohovski на gmail.com (Alessandro Gorohovski) Date: Wed, 28 Nov 2018 22:04:41 +0300 Subject: [Moscow.pm] Interesting behavior of 'delete' function Message-ID: Приветствую Уважаемое 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 ? С уважением, Александр. ----------- следующая часть ----------- Вложение в формате HTML было извлечено… URL: From ivan на bessarabov.ru Wed Nov 28 11:13:47 2018 From: ivan на bessarabov.ru (=?UTF-8?B?0JjQstCw0L0g0JHQtdGB0YHQsNGA0LDQsdC+0LI=?=) Date: Wed, 28 Nov 2018 22:13:47 +0300 Subject: [Moscow.pm] Interesting behavior of 'delete' function In-Reply-To: References: Message-ID: Тут дело не в delete https://perldoc.perl.org/perldata.html#Multi-dimensional-array-emulation https://perldoc.perl.org/perlvar.html#%24%3b On Wed, 28 Nov 2018 at 22:05, Alessandro Gorohovski via Moscow-pm < moscow-pm на pm.org> wrote: > Приветствую Уважаемое 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 > ----------- следующая часть ----------- Вложение в формате HTML было извлечено… URL: From kes-kes на yandex.ru Wed Nov 28 11:30:46 2018 From: kes-kes на yandex.ru (Eugen Konkov) Date: Wed, 28 Nov 2018 21:30:46 +0200 Subject: [Moscow.pm] Interesting behavior of 'delete' function In-Reply-To: References: Message-ID: <752580782.20181128213046@yandex.ru> Вложение в формате HTML было извлечено… URL: From an.gorohovski на gmail.com Wed Nov 28 12:53:45 2018 From: an.gorohovski на gmail.com (Alessandro Gorohovski) Date: Wed, 28 Nov 2018 23:53:45 +0300 Subject: [Moscow.pm] Interesting behavior of 'delete' function In-Reply-To: <752580782.20181128213046@yandex.ru> References: <752580782.20181128213046@yandex.ru> Message-ID: Hello Eugen, ср, 28 нояб. 2018 г. в 22:30, Eugen Konkov : > Hello Alessandro, > > 1. Это поведение объясняется autovivification. > Не согласен. Pardon me, причем здесь autovivification > 2. А где вы такой синтаксис увидели? > delete $a{11}{21,24}{31} > Sorry, вообще, это классика. See Larry Wall, Tom Christiansen, & Jon Orwant, Programming Perl, 3rd Russian ed. -p.759, please. > Wednesday, November 28, 2018, 9:04:41 PM, you wrote: > > > Приветствую Уважаемое 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 > ? > > С уважением, > Александр. > > > > > > *-- Best regards, Eugen Konkov* > ----------- следующая часть ----------- Вложение в формате HTML было извлечено… URL: From ivan на bessarabov.ru Wed Nov 28 13:07:48 2018 From: ivan на bessarabov.ru (=?UTF-8?B?0JjQstCw0L0g0JHQtdGB0YHQsNGA0LDQsdC+0LI=?=) Date: Thu, 29 Nov 2018 00:07:48 +0300 Subject: [Moscow.pm] Interesting behavior of 'delete' function In-Reply-To: References: <752580782.20181128213046@yandex.ru> Message-ID: > причем здесь autovivification А куда в результате появился пустой hashref? ``` '21 24' => {} ``` > Programming Perl, 3rd Russian ed. -p.759, Разве `delete @{ $dungeon[$x][$y] }{ "OCCUPIED", "DAMP", "LIGHTED" };` это то же самое что и `delete $a{11}{21,24}{31}` ? On Wed, Nov 28, 2018 at 11:54 PM Alessandro Gorohovski via Moscow-pm < moscow-pm на pm.org> wrote: > Hello Eugen, > > > ср, 28 нояб. 2018 г. в 22:30, Eugen Konkov : > >> Hello Alessandro, >> >> 1. Это поведение объясняется autovivification. >> > > Не согласен. Pardon me, причем здесь autovivification > > >> 2. А где вы такой синтаксис увидели? >> delete $a{11}{21,24}{31} >> > > Sorry, вообще, это классика. > See Larry Wall, Tom Christiansen, & Jon Orwant, Programming Perl, 3rd > Russian ed. -p.759, > please. > > > >> Wednesday, November 28, 2018, 9:04:41 PM, you wrote: >> >> >> Приветствую Уважаемое 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 >> ? >> >> С уважением, >> Александр. >> >> >> >> >> >> *-- Best regards, Eugen Konkov* >> > -- > Moscow.pm mailing list > moscow-pm на pm.org | http://moscow.pm.org > ----------- следующая часть ----------- Вложение в формате HTML было извлечено… URL: From victor на bo4karev.ru Wed Nov 28 20:56:46 2018 From: victor на bo4karev.ru (=?utf-8?B?0JLQuNC60YLQvtGAINCR0L7Rh9C60LDRgNC10LI=?=) Date: Thu, 29 Nov 2018 07:56:46 +0300 Subject: [Moscow.pm] Interesting behavior of 'delete' function In-Reply-To: References: Message-ID: <6110641543467406@iva5-d3020dc3459d.qloud-c.yandex.net> Вложение в формате HTML было извлечено… URL: From an.gorohovski на gmail.com Wed Nov 28 22:46:44 2018 From: an.gorohovski на gmail.com (Alessandro Gorohovski) Date: Thu, 29 Nov 2018 09:46:44 +0300 Subject: [Moscow.pm] Interesting behavior of 'delete' function In-Reply-To: References: <752580782.20181128213046@yandex.ru> Message-ID: Иван, Здравствуйте. чт, 29 нояб. 2018 г. в 00:08, Иван Бессарабов via Moscow-pm < moscow-pm на pm.org>: > > > причем здесь autovivification > > А куда в результате появился пустой hashref? > > Вот и я об этом, куд-куда и зачем он взялся то? когда функция delete, наоборот, должна, как минимум ничего не cделать. > ``` > '21 24' => {} > ``` > вообще, если быть точным, там появился '21 24' => {}, > > Programming Perl, 3rd Russian ed. -p.759, > > Разве `delete @{ $dungeon[$x][$y] }{ "OCCUPIED", "DAMP", "LIGHTED" };` > это то же самое что и `delete $a{11}{21,24}{31}` ? > > Меня попросили/спросили я ответил. Извините, я и не утверждал что это то же самое. > On Wed, Nov 28, 2018 at 11:54 PM Alessandro Gorohovski via Moscow-pm < > moscow-pm на pm.org> wrote: > >> Hello Eugen, >> >> ср, 28 нояб. 2018 г. в 22:30, Eugen Konkov : >> >>> Hello Alessandro, >>> >>> 1. Это поведение объясняется autovivification. >>> >> >> Не согласен. Pardon me, причем здесь autovivification >> >> >>> 2. А где вы такой синтаксис увидели? >>> delete $a{11}{21,24}{31} >>> >> >> Sorry, вообще, это классика. >> See Larry Wall, Tom Christiansen, & Jon Orwant, Programming Perl, 3rd >> Russian ed. -p.759, >> please. >> >> >> >>> Wednesday, November 28, 2018, 9:04:41 PM, you wrote: >>> >>> >>> Приветствую Уважаемое 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 >>> ? >>> >>> С уважением, >>> Александр. >>> >>> >>> >>> >>> >>> *-- Best regards, Eugen Konkov* >>> >> -- >> Moscow.pm mailing list >> moscow-pm на pm.org | http://moscow.pm.org >> > -- > Moscow.pm mailing list > moscow-pm на pm.org | http://moscow.pm.org > ----------- следующая часть ----------- Вложение в формате HTML было извлечено… URL: From dim0xff на gmail.com Wed Nov 28 22:50:01 2018 From: dim0xff на gmail.com (Dmitry L.) Date: Thu, 29 Nov 2018 09:50:01 +0300 Subject: [Moscow.pm] Interesting behavior of 'delete' function In-Reply-To: References: <752580782.20181128213046@yandex.ru> Message-ID: > ``` >> '21 24' => {} >> ``` >> > вообще, если быть точным, там появился > '21 24' => {}, > И в чём разница? -- //wbr, Dmitry L. ----------- следующая часть ----------- Вложение в формате HTML было извлечено… URL: From an.gorohovski на gmail.com Wed Nov 28 22:56:15 2018 From: an.gorohovski на gmail.com (Alessandro Gorohovski) Date: Thu, 29 Nov 2018 09:56:15 +0300 Subject: [Moscow.pm] Interesting behavior of 'delete' function In-Reply-To: References: <752580782.20181128213046@yandex.ru> Message-ID: чт, 29 нояб. 2018 г. в 09:50, Dmitry L. via Moscow-pm : > ``` >>> '21 24' => {} >>> ``` >>> >> вообще, если быть точным, там появился >> '21 24' => {}, >> > > И в чём разница? > In fact, между 21 и 24 не space. К этому элементу вы не сможете обратиться напрямую, проверить его существование (exists) или удалить :) > -- > //wbr, Dmitry L. > -- > Moscow.pm mailing list > moscow-pm на pm.org | http://moscow.pm.org > ----------- следующая часть ----------- Вложение в формате HTML было извлечено… URL: From ivan на bessarabov.ru Wed Nov 28 22:59:40 2018 From: ivan на bessarabov.ru (=?UTF-8?B?0JjQstCw0L0g0JHQtdGB0YHQsNGA0LDQsdC+0LI=?=) Date: Thu, 29 Nov 2018 09:59:40 +0300 Subject: [Moscow.pm] Interesting behavior of 'delete' function In-Reply-To: References: <752580782.20181128213046@yandex.ru> Message-ID: Почему не смогу? А если вот так ->{"21$;24"} ? On Thu, 29 Nov 2018 at 09:56, Alessandro Gorohovski via Moscow-pm < moscow-pm на pm.org> wrote: > чт, 29 нояб. 2018 г. в 09:50, Dmitry L. via Moscow-pm : > >> ``` >>>> '21 24' => {} >>>> ``` >>>> >>> вообще, если быть точным, там появился >>> '21 24' => {}, >>> >> >> И в чём разница? >> > > In fact, между 21 и 24 не space. > К этому элементу вы не сможете обратиться напрямую, проверить его > существование (exists) > или удалить > :) > > >> -- >> //wbr, Dmitry L. >> -- >> Moscow.pm mailing list >> moscow-pm на pm.org | http://moscow.pm.org >> > -- > Moscow.pm mailing list > moscow-pm на pm.org | http://moscow.pm.org > ----------- следующая часть ----------- Вложение в формате HTML было извлечено… URL: From an.gorohovski на gmail.com Wed Nov 28 23:03:14 2018 From: an.gorohovski на gmail.com (Alessandro Gorohovski) Date: Thu, 29 Nov 2018 10:03:14 +0300 Subject: [Moscow.pm] Interesting behavior of 'delete' function In-Reply-To: <6110641543467406@iva5-d3020dc3459d.qloud-c.yandex.net> References: <6110641543467406@iva5-d3020dc3459d.qloud-c.yandex.net> Message-ID: Виктор, Приветствую! чт, 29 нояб. 2018 г. в 08:04, Виктор Бочкарев via Moscow-pm < moscow-pm на pm.org>: > День добрый! > > По моему, эмуляция массива работает при обращении к хешу, а не к ссылке на > хеш. > > Попробуй так delete @h{11}->@{qw(21 24)}; > Да, ну, нет конечно :) это не работает in 1st, in 2nd таким приемом вы предлагаете удалить все элементы принадлежащие $a{11}{21} и $a{11}{24} а требуется удалить только подэлементы {31} i.e. $a{11}{21}{31} и $a{11}{24}{31} > > 28.11.2018, 22:05, "Alessandro Gorohovski via Moscow-pm" >: > > Приветствую Уважаемое 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 > > > > -- > С уважением, > Виктор Бочкарев ( victor на bo4karev.ru ) > +7 (916) 925 64 99 > > > -- > Moscow.pm mailing list > moscow-pm на pm.org | http://moscow.pm.org > ----------- следующая часть ----------- Вложение в формате HTML было извлечено… URL: From an.gorohovski на gmail.com Wed Nov 28 23:08:31 2018 From: an.gorohovski на gmail.com (Alessandro Gorohovski) Date: Thu, 29 Nov 2018 10:08:31 +0300 Subject: [Moscow.pm] Interesting behavior of 'delete' function In-Reply-To: References: <6110641543467406@iva5-d3020dc3459d.qloud-c.yandex.net> Message-ID: Ok, understand. Придется делать как обычно: delete $a{11}{$_}{31} for 21, 24; Спасибо Всем, Хорошего дня, Александр ----------- следующая часть ----------- Вложение в формате HTML было извлечено… URL: From an.gorohovski на gmail.com Wed Nov 28 23:11:41 2018 From: an.gorohovski на gmail.com (Alessandro Gorohovski) Date: Thu, 29 Nov 2018 10:11:41 +0300 Subject: [Moscow.pm] Interesting behavior of 'delete' function In-Reply-To: References: <752580782.20181128213046@yandex.ru> Message-ID: чт, 29 нояб. 2018 г. в 09:59, Иван Бессарабов : > Почему не смогу? > > А если вот так ->{"21$;24"} > > ? > Да, конечно :) > On Thu, 29 Nov 2018 at 09:56, Alessandro Gorohovski via Moscow-pm < > moscow-pm на pm.org> wrote: > >> чт, 29 нояб. 2018 г. в 09:50, Dmitry L. via Moscow-pm : >> >>> ``` >>>>> '21 24' => {} >>>>> ``` >>>>> >>>> вообще, если быть точным, там появился >>>> '21 24' => {}, >>>> >>> >>> И в чём разница? >>> >> >> In fact, между 21 и 24 не space. >> К этому элементу вы не сможете обратиться напрямую, проверить его >> существование (exists) >> или удалить >> :) >> >> >>> -- >>> //wbr, Dmitry L. >>> -- >>> Moscow.pm mailing list >>> moscow-pm на pm.org | http://moscow.pm.org >>> >> -- >> Moscow.pm mailing list >> moscow-pm на pm.org | http://moscow.pm.org >> > ----------- следующая часть ----------- Вложение в формате HTML было извлечено… URL: From an.gorohovski на gmail.com Wed Nov 28 23:26:52 2018 From: an.gorohovski на gmail.com (Alessandro Gorohovski) Date: Thu, 29 Nov 2018 10:26:52 +0300 Subject: [Moscow.pm] Interesting behavior of 'delete' function In-Reply-To: References: Message-ID: Иван, Спасибо! ср, 28 нояб. 2018 г. в 22:14, Иван Бессарабов : > Тут дело не в delete > > https://perldoc.perl.org/perldata.html#Multi-dimensional-array-emulation > > https://perldoc.perl.org/perlvar.html#%24%3b > > > On Wed, 28 Nov 2018 at 22:05, Alessandro Gorohovski via Moscow-pm < > moscow-pm на pm.org> wrote: > >> Приветствую Уважаемое 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 >> > ----------- следующая часть ----------- Вложение в формате HTML было извлечено… URL: From andrei.protasovitski на gmail.com Thu Nov 29 01:40:08 2018 From: andrei.protasovitski на gmail.com (Andrei) Date: Thu, 29 Nov 2018 10:40:08 +0100 Subject: [Moscow.pm] Interesting behavior of 'delete' function In-Reply-To: References: Message-ID: Давным давно, когда в 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: From andrei.protasovitski на gmail.com Thu Nov 29 01:42:36 2018 From: andrei.protasovitski на gmail.com (Andrei) Date: Thu, 29 Nov 2018 10:42:36 +0100 Subject: [Moscow.pm] Interesting behavior of 'delete' function In-Reply-To: References: <752580782.20181128213046@yandex.ru> Message-ID: чт, 29 нояб. 2018 г. в 07:57, Alessandro Gorohovski via Moscow-pm < moscow-pm на pm.org>: > чт, 29 нояб. 2018 г. в 09:50, Dmitry L. via Moscow-pm : > >> ``` >>>> '21 24' => {} >>>> ``` >>>> >>> вообще, если быть точным, там появился >>> '21 24' => {}, >>> >> >> И в чём разница? >> > > In fact, между 21 и 24 не space. > К этому элементу вы не сможете обратиться напрямую, проверить его > существование (exists) > или удалить > :) > Это можно сделать. То, что там отображается пробел, всего лишь поведение локали. На самом деле там символ из переменной $;, значение которой по умолчанию \034. > > >> -- >> //wbr, Dmitry L. >> -- >> Moscow.pm mailing list >> moscow-pm на pm.org | http://moscow.pm.org >> > -- > 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: From an.gorohovski на gmail.com Thu Nov 29 01:53:16 2018 From: an.gorohovski на gmail.com (Alessandro Gorohovski) Date: Thu, 29 Nov 2018 12:53:16 +0300 Subject: [Moscow.pm] Interesting behavior of 'delete' function In-Reply-To: References: Message-ID: чт, 29 нояб. 2018 г. в 12:40, Andrei : > Давным давно, когда в 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: From andrei.protasovitski на gmail.com Thu Nov 29 02:06:05 2018 From: andrei.protasovitski на gmail.com (Andrei) Date: Thu, 29 Nov 2018 11:06:05 +0100 Subject: [Moscow.pm] Interesting behavior of 'delete' function In-Reply-To: References: Message-ID: Всё верно. По шагам: delete $a{11}{21,24}{31} 1. Сначала ищется элемент $a{11}. Он есть, и он ссылка на хэш. 2. Дальше в это подхэше ищется элемент $a{11}{21,24}. Список (21,24) преобразуется в строку "21$;24". Такого элемента не находится, поэтому из-за autovivification, включённого по умолчанию, этот элемент создаётся и его значение устанавливается в undef. 3. Далее ищется элемент $a{11}{21,24}{31}. Его нет, поэтому значением $a{11}{21,24} становится ссылка на хэш, в котором снова из-за autovivification создаётся элемент с ключом 31 и значением undef. 4. И только после этого delete удаляет только что созданные элемент и возвращает его значение undef. Элемент, созданный на шаге 2, никуда не девается, вот он там и сидит, память занимает, программистов пугает. :) чт, 29 нояб. 2018 г. в 10:53, Alessandro Gorohovski : > > чт, 29 нояб. 2018 г. в 12:40, Andrei : > >> Давным давно, когда в 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 >> > -- Andrei Protasovitski < andrei[dot]protasovitski[at]gmail[dot]com > Diemen, Netherlands ----------- следующая часть ----------- Вложение в формате HTML было извлечено… URL: From an.gorohovski на gmail.com Thu Nov 29 02:14:27 2018 From: an.gorohovski на gmail.com (Alessandro Gorohovski) Date: Thu, 29 Nov 2018 13:14:27 +0300 Subject: [Moscow.pm] Interesting behavior of 'delete' function In-Reply-To: References: Message-ID: чт, 29 нояб. 2018 г. в 13:06, Andrei : > Всё верно. > > По шагам: > > delete $a{11}{21,24}{31} > > 1. Сначала ищется элемент $a{11}. Он есть, и он ссылка на хэш. > 2. Дальше в это подхэше ищется элемент $a{11}{21,24}. Список (21,24) > преобразуется в строку "21$;24". Такого элемента не находится, поэтому > из-за autovivification, включённого по умолчанию, этот элемент создаётся и > его значение устанавливается в undef. > 3. Далее ищется элемент $a{11}{21,24}{31}. Его нет, поэтому > значением $a{11}{21,24} становится ссылка на хэш, в котором снова > из-за autovivification создаётся элемент с ключом 31 и значением undef. > 4. И только после этого delete удаляет только что созданные элемент и > возвращает его значение undef. > > Элемент, созданный на шаге 2, никуда не девается, вот он там и сидит, > память занимает, программистов пугает. > :) > Да, Андрей, это всё верно вы представили/объяснили :) Подобную ситуацию пожалуйста посмотрите тут: https://www.youtube.com/watch?v=ZIig5fgp7nY ----------- следующая часть ----------- Вложение в формате HTML было извлечено… URL: From an.gorohovski на gmail.com Thu Nov 29 02:16:16 2018 From: an.gorohovski на gmail.com (Alessandro Gorohovski) Date: Thu, 29 Nov 2018 13:16:16 +0300 Subject: [Moscow.pm] Interesting behavior of 'delete' function In-Reply-To: References: Message-ID: или здесь: https://www.youtube.com/watch?v=2wxL3DYen5g чт, 29 нояб. 2018 г. в 13:14, Alessandro Gorohovski : > чт, 29 нояб. 2018 г. в 13:06, Andrei : > >> Всё верно. >> >> По шагам: >> >> delete $a{11}{21,24}{31} >> >> 1. Сначала ищется элемент $a{11}. Он есть, и он ссылка на хэш. >> 2. Дальше в это подхэше ищется элемент $a{11}{21,24}. Список (21,24) >> преобразуется в строку "21$;24". Такого элемента не находится, поэтому >> из-за autovivification, включённого по умолчанию, этот элемент создаётся и >> его значение устанавливается в undef. >> 3. Далее ищется элемент $a{11}{21,24}{31}. Его нет, поэтому >> значением $a{11}{21,24} становится ссылка на хэш, в котором снова >> из-за autovivification создаётся элемент с ключом 31 и значением undef. >> 4. И только после этого delete удаляет только что созданные элемент и >> возвращает его значение undef. >> >> Элемент, созданный на шаге 2, никуда не девается, вот он там и сидит, >> память занимает, программистов пугает. >> :) >> > > Да, Андрей, это всё верно вы представили/объяснили > :) > Подобную ситуацию пожалуйста посмотрите тут: > https://www.youtube.com/watch?v=ZIig5fgp7nY > > ----------- следующая часть ----------- Вложение в формате HTML было извлечено… URL: