From an.gorohovski на gmail.com Tue Oct 1 02:34:18 2024 From: an.gorohovski на gmail.com (Alessandro Gorohovski) Date: Tue, 1 Oct 2024 12:34:18 +0300 Subject: [Moscow.pm] =?utf-8?b?0KPQt9C90LDRgtGMINGA0L7QtNC40YLQtdC70Yw=?= =?utf-8?b?0YHQutC40Lkg0LrQu9GO0Ycg0L/QviDRgdGB0YvQu9C60LU=?= Message-ID: Уважаемое сообщество, приветствую! Подскажите, может кто-нибудб знает/сталкивался: существует ли способ узнать родительский ключ хеша по ссылке? # Например, есть хеш my %h = ( a => { b=> 1}, aa=> {bb=>2, }, ); # вызов функции, где необходимо узнать родительский ключ # например, 'aa' my $k = &where_key( \%{ $h{aa} } ); exit; sub where_key { my $sh = shift; my $k = ??? if ref( $sh ) eq 'HASH'; return $k; } ----------- следующая часть ----------- Вложение в формате HTML было извлечено… URL: From steffen на steffen-winkler.de Tue Oct 1 03:03:44 2024 From: steffen на steffen-winkler.de (Steffen Winkler) Date: Tue, 1 Oct 2024 12:03:44 +0200 Subject: [Moscow.pm] =?utf-8?b?0KPQt9C90LDRgtGMINGA0L7QtNC40YLQtdC70Yw=?= =?utf-8?b?0YHQutC40Lkg0LrQu9GO0Ycg0L/QviDRgdGB0YvQu9C60LU=?= In-Reply-To: References: Message-ID: <36947f2c-7034-4d69-aae3-b943f8bd9cb3@steffen-winkler.de> use strict; use warnings; my %h = ( a => { b=> 1}, aa=> {bb=>2, }, ); sub where_key {     my $ref = shift;     while ( my ($key, $value) = each %h ) {         $ref eq $value              and return $key;     }     return; } my $k = where_key( $h{aa} ); print $k; exit; From ivan на serezhkin.com Tue Oct 1 03:08:13 2024 From: ivan на serezhkin.com (Ivan Serezhkin) Date: Tue, 01 Oct 2024 14:08:13 +0400 Subject: [Moscow.pm] =?utf-8?b?0KPQt9C90LDRgtGMINGA0L7QtNC40YLQtdC70Yw=?= =?utf-8?b?0YHQutC40Lkg0LrQu9GO0Ycg0L/QviDRgdGB0YvQu9C60LU=?= In-Reply-To: References: Message-ID: <100151727777208@mail.yandex.ru> Вложение в формате HTML было извлечено… URL: From an.gorohovski на gmail.com Tue Oct 1 03:46:41 2024 From: an.gorohovski на gmail.com (Alessandro Gorohovski) Date: Tue, 1 Oct 2024 13:46:41 +0300 Subject: [Moscow.pm] =?utf-8?b?0KPQt9C90LDRgtGMINGA0L7QtNC40YLQtdC70Yw=?= =?utf-8?b?0YHQutC40Lkg0LrQu9GO0Ycg0L/QviDRgdGB0YvQu9C60LU=?= In-Reply-To: <36947f2c-7034-4d69-aae3-b943f8bd9cb3@steffen-winkler.de> References: <36947f2c-7034-4d69-aae3-b943f8bd9cb3@steffen-winkler.de> Message-ID: Нет, это не вариант. Функция не знает о хеше %h и его структуре, совсем не знает :) Представьте, что этот хеш может быть не 2х уровневый, а много-много-вложенный по уровням и $ref eq $value может случится на другом уровне. вт, 1 окт. 2024 г. в 13:03, Steffen Winkler via Moscow-pm : > use strict; > use warnings; > > my %h = ( a => { b=> 1}, aa=> {bb=>2, }, ); > > sub where_key { > my $ref = shift; > > while ( my ($key, $value) = each %h ) { > $ref eq $value > and return $key; > } > > return; > } > > my $k = where_key( $h{aa} ); > print $k; > exit; > > > -- > Moscow.pm mailing list > moscow-pm на pm.org | http://moscow.pm.org > ----------- следующая часть ----------- Вложение в формате HTML было извлечено… URL: From an.gorohovski на gmail.com Tue Oct 1 03:48:54 2024 From: an.gorohovski на gmail.com (Alessandro Gorohovski) Date: Tue, 1 Oct 2024 13:48:54 +0300 Subject: [Moscow.pm] =?utf-8?b?0KPQt9C90LDRgtGMINGA0L7QtNC40YLQtdC70Yw=?= =?utf-8?b?0YHQutC40Lkg0LrQu9GO0Ycg0L/QviDRgdGB0YvQu9C60LU=?= In-Reply-To: <100151727777208@mail.yandex.ru> References: <100151727777208@mail.yandex.ru> Message-ID: Хорошо, пусть живет под несколькими ключами. А как получить к ним доступ ? вт, 1 окт. 2024 г. в 13:08, Ivan Serezhkin : > Гыыыыы оно живое ..... > > > И так, у тебя есть значение, ты хочешь узнать под каким ключём оно живёт? > > А вот теперь представь, это значение лежит сразу в двух хэшах, под разными > ключами .... > > -- > > 01.10.2024, 13:34, "Alessandro Gorohovski via Moscow-pm" >: > > Уважаемое сообщество, приветствую! > > Подскажите, может кто-нибудб знает/сталкивался: > существует ли способ узнать родительский ключ хеша по ссылке? > > # Например, есть хеш > my %h = ( a => { b=> 1}, aa=> {bb=>2, }, ); > > # вызов функции, где необходимо узнать родительский ключ > # например, 'aa' > my $k = &where_key( \%{ $h{aa} } ); > > exit; > > sub where_key { > my $sh = shift; > > my $k = ??? if ref( $sh ) eq 'HASH'; > > return $k; > } > ,-- > Moscow.pm mailing list > moscow-pm на pm.org | http://moscow.pm.org > > ----------- следующая часть ----------- Вложение в формате HTML было извлечено… URL: From ivan на serezhkin.com Tue Oct 1 04:00:21 2024 From: ivan на serezhkin.com (Ivan Serezhkin) Date: Tue, 01 Oct 2024 15:00:21 +0400 Subject: [Moscow.pm] =?utf-8?b?0KPQt9C90LDRgtGMINGA0L7QtNC40YLQtdC70Yw=?= =?utf-8?b?0YHQutC40Lkg0LrQu9GO0Ycg0L/QviDRgdGB0YvQu9C60LU=?= In-Reply-To: References: <100151727777208@mail.yandex.ru> Message-ID: <646491727780305@mail.yandex.ru> Вложение в формате HTML было извлечено… URL: From theathlet на yandex.ru Tue Oct 1 04:37:55 2024 From: theathlet на yandex.ru (=?utf-8?B?0JrQvtCy0LDQu9GMINCS0Y/Rh9C10YHQu9Cw0LI=?=) Date: Tue, 01 Oct 2024 14:37:55 +0300 Subject: [Moscow.pm] =?utf-8?b?0KPQt9C90LDRgtGMINGA0L7QtNC40YLQtdC70Yw=?= =?utf-8?b?0YHQutC40Lkg0LrQu9GO0Ycg0L/QviDRgdGB0YvQu9C60LU=?= In-Reply-To: References: <36947f2c-7034-4d69-aae3-b943f8bd9cb3@steffen-winkler.de> Message-ID: <125651727782477@mail.yandex.ru> Вложение в формате HTML было извлечено… URL: From an.gorohovski на gmail.com Tue Oct 1 04:43:48 2024 From: an.gorohovski на gmail.com (Alessandro Gorohovski) Date: Tue, 1 Oct 2024 14:43:48 +0300 Subject: [Moscow.pm] =?utf-8?b?0KPQt9C90LDRgtGMINGA0L7QtNC40YLQtdC70Yw=?= =?utf-8?b?0YHQutC40Lkg0LrQu9GO0Ycg0L/QviDRgdGB0YvQu9C60LU=?= In-Reply-To: <125651727782477@mail.yandex.ru> References: <36947f2c-7034-4d69-aae3-b943f8bd9cb3@steffen-winkler.de> <125651727782477@mail.yandex.ru> Message-ID: Вообще то передаётся ссылка (фактически адрес) \%{ $h{aa} } , а не просто значение. вт, 1 окт. 2024 г. в 14:37, Коваль Вячеслав : > Для решения задачи все равно нужен доступ к исходному хэшу, т.к. в > изначальном коде мы передаем уже обращаемся по ключу и в функцию уже > передается значение, т.е. какой-то хэш или массив или значение. А чтобы > получить ключ, то нужно рекурсивно пройтись по исходному хэшу и сравнить > Scalar::Util::refaddr всех значений с исходным. > > ---------------- > 01.10.2024, 13:47, "Alessandro Gorohovski via Moscow-pm" >: > Кому: Moscow.pm group (moscow-pm на pm.org); > Копия: Alessandro Gorohovski (an.gorohovski на gmail.com); > Тема: [Moscow.pm] Узнать родительский ключ по ссылке; > > > Нет, это не вариант. > Функция не знает о хеше %h и его структуре, совсем не знает :) > > Представьте, что этот хеш может быть не 2х уровневый, а > много-много-вложенный по уровням > и > $ref eq $value > может случится на другом уровне. > > > вт, 1 окт. 2024 г. в 13:03, Steffen Winkler via Moscow-pm < > moscow-pm на pm.org>: > > use strict; > use warnings; > > my %h = ( a => { b=> 1}, aa=> {bb=>2, }, ); > > sub where_key { > my $ref = shift; > > while ( my ($key, $value) = each %h ) { > $ref eq $value > and return $key; > } > > return; > } > > my $k = where_key( $h{aa} ); > print $k; > exit; > > > -- > Moscow.pm mailing list > moscow-pm на pm.org | http://moscow.pm.org > > ,-- > Moscow.pm mailing list > moscow-pm на pm.org | http://moscow.pm.org > > > > > > -- > Яндекс.Почта — надёжная почта > http://mail.yandex.ru/neo2/collect/?exp=1&t=1 > ----------- следующая часть ----------- Вложение в формате HTML было извлечено… URL: From theathlet на yandex.ru Tue Oct 1 05:03:50 2024 From: theathlet на yandex.ru (=?utf-8?B?0JrQvtCy0LDQu9GMINCS0Y/Rh9C10YHQu9Cw0LI=?=) Date: Tue, 01 Oct 2024 15:03:50 +0300 Subject: [Moscow.pm] =?utf-8?b?0KPQt9C90LDRgtGMINGA0L7QtNC40YLQtdC70Yw=?= =?utf-8?b?0YHQutC40Lkg0LrQu9GO0Ycg0L/QviDRgdGB0YvQu9C60LU=?= In-Reply-To: References: <36947f2c-7034-4d69-aae3-b943f8bd9cb3@steffen-winkler.de> <125651727782477@mail.yandex.ru> Message-ID: <158341727783484@mail.yandex.ru> Вложение в формате HTML было извлечено… URL: From steffen на steffen-winkler.de Tue Oct 1 08:17:40 2024 From: steffen на steffen-winkler.de (Steffen Winkler) Date: Tue, 1 Oct 2024 17:17:40 +0200 Subject: [Moscow.pm] =?utf-8?b?0KPQt9C90LDRgtGMINGA0L7QtNC40YLQtdC70Yw=?= =?utf-8?b?0YHQutC40Lkg0LrQu9GO0Ycg0L/QviDRgdGB0YvQu9C60LU=?= In-Reply-To: <158341727783484@mail.yandex.ru> References: <36947f2c-7034-4d69-aae3-b943f8bd9cb3@steffen-winkler.de> <125651727782477@mail.yandex.ru> <158341727783484@mail.yandex.ru> Message-ID: Hello, What I have done in the while loop, I check the stringified reference of that hash reference. If that is equal, the the same hash reference is there and I return the output. If there are more then one equal hash references you have to put the keys into an array and do not return. Steffen auto translated Здравствуйте, В цикле while я проверяю строковую ссылку на эту хэш-ссылку. Если она равна, то это одна и та же хэш-ссылка и я возвращаю вывод. Если равных хэш-ссылок больше одной, то нужно поместить ключи в массив и не возвращать. Штеффен Am 01.10.2024 um 14:03 schrieb Коваль Вячеслав via Moscow-pm: > Смотри, во-первых, в данном случае нет необходимости разыменовывать > хэш и брать из него ссылку. Можено сразу передавать нужный хэш: $h{aa}. > Во-вторых, в функцию (в нижеприведенном коде вместо функции выступает > переменная $val) мы уже передаем ссылку на хэш > { bb => 2 }. Функция ничего не знает о ключе, он есть только в хэше. > #!/usr/bin/perl -w > use strict; > use warnings; > use feature 'say'; > use DDP; > use Scalar::Util qw/refaddr/; > my %h = ( a => { b => 1 }, aa => { bb => 2 } ); > p %h; > say refaddr $h{aa}; > my $val = $h{aa}; > p $val; > say refaddr $val; > say refaddr $h{aa} == refaddr $val; > Как вариант можно передавать предыдущее значение, где есть ключ. > my %h = (aa => { bb => { cc => 3}}); > where_key('bb', $h{aa}); > > Либо передавать исходных хэш: > > where_key($искомая_ссылка, \%h); > ---------------- > 01.10.2024, 14:44, "Alessandro Gorohovski" : > Кому: Коваль Вячеслав (theathlet на yandex.ru); > Копия: Moscow.pm group (moscow-pm на pm.org); > Тема: [Moscow.pm] Узнать родительский ключ по ссылке; > > Вообще то передаётся ссылка (фактически адрес) >  \%{ $h{aa} } > , а не просто значение. > вт, 1 окт. 2024 г. в 14:37, Коваль Вячеслав : > > Для решения задачи все равно нужен доступ к исходному хэшу, > т.к. в изначальном коде мы передаем уже обращаемся по ключу и > в функцию уже передается значение, т.е. какой-то хэш или > массив или значение. А чтобы получить ключ, то нужно > рекурсивно пройтись по исходному хэшу и сравнить > Scalar::Util::refaddr всех значений с исходным. > ---------------- > 01.10.2024, 13:47, "Alessandro Gorohovski via Moscow-pm" > : > Кому: Moscow.pm group (moscow-pm на pm.org); > Копия: Alessandro Gorohovski (an.gorohovski на gmail.com); > Тема: [Moscow.pm] Узнать родительский ключ по ссылке; > > Нет, это не вариант. > Функция не знает о хеше %h и его структуре, совсем не знает :) > Представьте, что этот хеш может быть не 2х уровневый, а > много-много-вложенный по уровням > и > $ref eq $value > может случится на другом уровне. > вт, 1 окт. 2024 г. в 13:03, Steffen Winkler via Moscow-pm > : > > use strict; > use warnings; > > my %h = ( a => { b=> 1}, aa=> {bb=>2, }, ); > > sub where_key { >      my $ref = shift; > >      while ( my ($key, $value) = each %h ) { >          $ref eq $value >               and return $key; >      } > >      return; > } > > my $k = where_key( $h{aa} ); > print $k; > exit; > > > -- > Moscow.pm mailing list > moscow-pm на pm.org | http://moscow.pm.org > > ,-- > Moscow.pm mailing list > moscow-pm на pm.org | http://moscow.pm.org > > -- > Яндекс.Почта — надёжная почта > http://mail.yandex.ru/neo2/collect/?exp=1&t=1 > > > -- > Яндекс.Почта — надёжная почта > http://mail.yandex.ru/neo2/collect/?exp=1&t=1 > ----------- следующая часть ----------- Вложение в формате HTML было извлечено… URL: From an.gorohovski на gmail.com Tue Oct 1 10:24:22 2024 From: an.gorohovski на gmail.com (Alessandro Gorohovski) Date: Tue, 1 Oct 2024 20:24:22 +0300 Subject: [Moscow.pm] =?utf-8?b?0KPQt9C90LDRgtGMINGA0L7QtNC40YLQtdC70Yw=?= =?utf-8?b?0YHQutC40Lkg0LrQu9GO0Ycg0L/QviDRgdGB0YvQu9C60LU=?= In-Reply-To: <158341727783484@mail.yandex.ru> References: <36947f2c-7034-4d69-aae3-b943f8bd9cb3@steffen-winkler.de> <125651727782477@mail.yandex.ru> <158341727783484@mail.yandex.ru> Message-ID: вт, 1 окт. 2024 г. в 15:03, Коваль Вячеслав : > Смотри, во-первых, в данном случае нет необходимости разыменовывать хэш и > брать из него ссылку. Можено сразу передавать нужный хэш: $h{aa}. > Да, согласен, конечно можно и нужно так. Спасибо. Просто хотел этой конструкцией дополнительно выделить цель и обратить на неё внимание. > Во-вторых, в функцию (в нижеприведенном коде вместо функции выступает > переменная $val) мы уже передаем ссылку на хэш > { bb => 2 }. Функция ничего не знает о ключе, он есть только в хэше. > > Понимаете, здесь проблема не в том, чтобы узнать какие ключи-потомки есть в передаваемой ссылке, а узнать именно родительский ключ '*aa*'. > #!/usr/bin/perl -w > use strict; > use warnings; > use feature 'say'; > > use DDP; > use Scalar::Util qw/refaddr/; > > my %h = ( a => { b => 1 }, aa => { bb => 2 } ); > p %h; > say refaddr $h{aa}; > my $val = $h{aa}; > p $val; > say refaddr $val; > say refaddr $h{aa} == refaddr $val; > К сожалению это всё предполагает, что вы *наперед знаете о том, что родительский ключ 'аа'* и ожидаете когда ссылка на него появится. А если неизвестно заранее как называется родительский ключ? Известно только, что такой ключ единственный. > > Как вариант можно передавать предыдущее значение, где есть ключ. > > my %h = (aa => { bb => { cc => 3}}); > where_key('bb', $h{aa}); > > Здесь, честно говоря, не понятно как эта функция вернёт ключ 'aa' ? > Либо передавать исходных хэш: > > where_key($искомая_ссылка, \%h); > Теоретически возможно, хотя чрезвычайно сложно и здесь придётся искать совпадения адресов с передаваемым ссылкой по всему хешу с неизвестной структурой. Я предполагал, что можно получить доступ к некой "глобальной" таблице с описанием связей 'ключ' => 'адрес' или наоборот. А зная адрес найти нужный 'ключ'. > ---------------- > 01.10.2024, 14:44, "Alessandro Gorohovski" : > Кому: Коваль Вячеслав (theathlet на yandex.ru); > Копия: Moscow.pm group (moscow-pm на pm.org); > Тема: [Moscow.pm] Узнать родительский ключ по ссылке; > > > Вообще то передаётся ссылка (фактически адрес) > > \%{ $h{aa} } > > , а не просто значение. > > вт, 1 окт. 2024 г. в 14:37, Коваль Вячеслав : > > Для решения задачи все равно нужен доступ к исходному хэшу, т.к. в > изначальном коде мы передаем уже обращаемся по ключу и в функцию уже > передается значение, т.е. какой-то хэш или массив или значение. А чтобы > получить ключ, то нужно рекурсивно пройтись по исходному хэшу и сравнить > Scalar::Util::refaddr всех значений с исходным. > > ---------------- > 01.10.2024, 13:47, "Alessandro Gorohovski via Moscow-pm" >: > Кому: Moscow.pm group (moscow-pm на pm.org); > Копия: Alessandro Gorohovski (an.gorohovski на gmail.com); > Тема: [Moscow.pm] Узнать родительский ключ по ссылке; > > > Нет, это не вариант. > Функция не знает о хеше %h и его структуре, совсем не знает :) > > Представьте, что этот хеш может быть не 2х уровневый, а > много-много-вложенный по уровням > и > $ref eq $value > может случится на другом уровне. > > > вт, 1 окт. 2024 г. в 13:03, Steffen Winkler via Moscow-pm < > moscow-pm на pm.org>: > > use strict; > use warnings; > > my %h = ( a => { b=> 1}, aa=> {bb=>2, }, ); > > sub where_key { > my $ref = shift; > > while ( my ($key, $value) = each %h ) { > $ref eq $value > and return $key; > } > > return; > } > > my $k = where_key( $h{aa} ); > print $k; > exit; > > > -- > Moscow.pm mailing list > moscow-pm на pm.org | http://moscow.pm.org > > ,-- > Moscow.pm mailing list > moscow-pm на pm.org | http://moscow.pm.org > > > > > > -- > Яндекс.Почта — надёжная почта > http://mail.yandex.ru/neo2/collect/?exp=1&t=1 > > > > > > -- > Яндекс.Почта — надёжная почта > http://mail.yandex.ru/neo2/collect/?exp=1&t=1 > ----------- следующая часть ----------- Вложение в формате HTML было извлечено… URL: From an.gorohovski на gmail.com Tue Oct 1 10:37:11 2024 From: an.gorohovski на gmail.com (Alessandro Gorohovski) Date: Tue, 1 Oct 2024 20:37:11 +0300 Subject: [Moscow.pm] =?utf-8?b?0KPQt9C90LDRgtGMINGA0L7QtNC40YLQtdC70Yw=?= =?utf-8?b?0YHQutC40Lkg0LrQu9GO0Ycg0L/QviDRgdGB0YvQu9C60LU=?= In-Reply-To: References: <36947f2c-7034-4d69-aae3-b943f8bd9cb3@steffen-winkler.de> <125651727782477@mail.yandex.ru> <158341727783484@mail.yandex.ru> Message-ID: Hello Steffen, вт, 1 окт. 2024 г. в 18:17, Steffen Winkler via Moscow-pm : > Hello, > What I have done in the while loop, I check the stringified reference of > that hash reference. If that is equal, the the same hash reference is there > and I return the output. If there are more then one equal hash references > you have to put the keys into an array and do not return. > It turns out that you know in advance what stringified references to expect ? Or you need to know the full structure of the hash you are investigating in order to create a lot of nested loops over nested arrays and hashes and scalars. --- Получается Вы заранее знаете какие строковые ссылки надо ожидать ? Или Вам необходимо знать полную структуру исследуемого хеша, чтобы создать массу вложенных циклов по вложенным массивам и хешам и скалярам. > Steffen > > auto translated > Здравствуйте, > В цикле while я проверяю строковую ссылку на эту хэш-ссылку. Если она > равна, то это одна и та же хэш-ссылка и я возвращаю вывод. Если равных > хэш-ссылок больше одной, то нужно поместить ключи в массив и не возвращать. > Штеффен > Am 01.10.2024 um 14:03 schrieb Коваль Вячеслав via Moscow-pm: > > Смотри, во-первых, в данном случае нет необходимости разыменовывать хэш и > брать из него ссылку. Можено сразу передавать нужный хэш: $h{aa}. > Во-вторых, в функцию (в нижеприведенном коде вместо функции выступает > переменная $val) мы уже передаем ссылку на хэш > { bb => 2 }. Функция ничего не знает о ключе, он есть только в хэше. > > #!/usr/bin/perl -w > use strict; > use warnings; > use feature 'say'; > > use DDP; > use Scalar::Util qw/refaddr/; > > my %h = ( a => { b => 1 }, aa => { bb => 2 } ); > p %h; > say refaddr $h{aa}; > my $val = $h{aa}; > p $val; > say refaddr $val; > say refaddr $h{aa} == refaddr $val; > > Как вариант можно передавать предыдущее значение, где есть ключ. > > my %h = (aa => { bb => { cc => 3}}); > where_key('bb', $h{aa}); > > Либо передавать исходных хэш: > > where_key($искомая_ссылка, \%h); > > ---------------- > 01.10.2024, 14:44, "Alessandro Gorohovski" > : > Кому: Коваль Вячеслав (theathlet на yandex.ru); > Копия: Moscow.pm group (moscow-pm на pm.org); > Тема: [Moscow.pm] Узнать родительский ключ по ссылке; > > > Вообще то передаётся ссылка (фактически адрес) > > \%{ $h{aa} } > > , а не просто значение. > > вт, 1 окт. 2024 г. в 14:37, Коваль Вячеслав : > > Для решения задачи все равно нужен доступ к исходному хэшу, т.к. в > изначальном коде мы передаем уже обращаемся по ключу и в функцию уже > передается значение, т.е. какой-то хэш или массив или значение. А чтобы > получить ключ, то нужно рекурсивно пройтись по исходному хэшу и сравнить > Scalar::Util::refaddr всех значений с исходным. > > ---------------- > 01.10.2024, 13:47, "Alessandro Gorohovski via Moscow-pm" >: > Кому: Moscow.pm group (moscow-pm на pm.org); > Копия: Alessandro Gorohovski (an.gorohovski на gmail.com); > Тема: [Moscow.pm] Узнать родительский ключ по ссылке; > > > Нет, это не вариант. > Функция не знает о хеше %h и его структуре, совсем не знает :) > > Представьте, что этот хеш может быть не 2х уровневый, а > много-много-вложенный по уровням > и > $ref eq $value > может случится на другом уровне. > > > вт, 1 окт. 2024 г. в 13:03, Steffen Winkler via Moscow-pm < > moscow-pm на pm.org>: > > use strict; > use warnings; > > my %h = ( a => { b=> 1}, aa=> {bb=>2, }, ); > > sub where_key { > my $ref = shift; > > while ( my ($key, $value) = each %h ) { > $ref eq $value > and return $key; > } > > return; > } > > my $k = where_key( $h{aa} ); > print $k; > exit; > > > -- > Moscow.pm mailing list > moscow-pm на pm.org | http://moscow.pm.org > > ,-- > Moscow.pm mailing list > moscow-pm на pm.org | http://moscow.pm.org > > > > > > -- > Яндекс.Почта — надёжная почта > http://mail.yandex.ru/neo2/collect/?exp=1&t=1 > > > > > > -- > Яндекс.Почта — надёжная почта > http://mail.yandex.ru/neo2/collect/?exp=1&t=1 > > -- > Moscow.pm mailing list > moscow-pm на pm.org | http://moscow.pm.org > ----------- следующая часть ----------- Вложение в формате HTML было извлечено… URL: From shatlovsky на gmail.com Tue Oct 1 11:06:27 2024 From: shatlovsky на gmail.com (Alex Shatlovsky) Date: Tue, 1 Oct 2024 20:06:27 +0200 Subject: [Moscow.pm] =?utf-8?b?0KPQt9C90LDRgtGMINGA0L7QtNC40YLQtdC70Yw=?= =?utf-8?b?0YHQutC40Lkg0LrQu9GO0Ycg0L/QviDRgdGB0YvQu9C60LU=?= In-Reply-To: References: <36947f2c-7034-4d69-aae3-b943f8bd9cb3@steffen-winkler.de> <125651727782477@mail.yandex.ru> <158341727783484@mail.yandex.ru> Message-ID: Если по значению нужно найти ключ, то придется рекурсивно обойти весь хеш и сверить. При этом ключей может быть больше одного. Но вопрос в другом: зачем это нужно? Почему бы просто не передать и ключ и значение туда, где это нужно? Или создать таблицу для обратного поиска. Met vriendelijke groet, Alex On Tue, Oct 1, 2024 at 7:24 PM Alessandro Gorohovski via Moscow-pm < moscow-pm на pm.org> wrote: > > вт, 1 окт. 2024 г. в 15:03, Коваль Вячеслав : > >> Смотри, во-первых, в данном случае нет необходимости разыменовывать хэш и >> брать из него ссылку. Можено сразу передавать нужный хэш: $h{aa}. >> > > Да, согласен, конечно можно и нужно так. Спасибо. > Просто хотел этой конструкцией дополнительно выделить цель и обратить на > неё внимание. > > >> Во-вторых, в функцию (в нижеприведенном коде вместо функции выступает >> переменная $val) мы уже передаем ссылку на хэш >> { bb => 2 }. Функция ничего не знает о ключе, он есть только в хэше. >> >> > > Понимаете, здесь проблема не в том, чтобы узнать какие ключи-потомки есть > в передаваемой ссылке, > а узнать именно родительский ключ '*aa*'. > > >> #!/usr/bin/perl -w >> use strict; >> use warnings; >> use feature 'say'; >> >> use DDP; >> use Scalar::Util qw/refaddr/; >> >> my %h = ( a => { b => 1 }, aa => { bb => 2 } ); >> p %h; >> say refaddr $h{aa}; >> my $val = $h{aa}; >> p $val; >> say refaddr $val; >> say refaddr $h{aa} == refaddr $val; >> > > К сожалению это всё предполагает, что вы *наперед знаете о том, что > родительский ключ 'аа'* > и ожидаете когда ссылка на него появится. > А если неизвестно заранее как называется родительский ключ? > Известно только, что такой ключ единственный. > > > >> >> Как вариант можно передавать предыдущее значение, где есть ключ. >> >> my %h = (aa => { bb => { cc => 3}}); >> where_key('bb', $h{aa}); >> >> > Здесь, честно говоря, не понятно как эта функция вернёт ключ 'aa' ? > > > >> Либо передавать исходных хэш: >> >> where_key($искомая_ссылка, \%h); >> > > Теоретически возможно, хотя чрезвычайно сложно и > здесь придётся искать совпадения адресов с передаваемым ссылкой > по всему хешу с неизвестной структурой. > > Я предполагал, что можно получить доступ к некой "глобальной" таблице с > описанием связей > 'ключ' => 'адрес' или наоборот. > А зная адрес найти нужный 'ключ'. > > >> ---------------- >> 01.10.2024, 14:44, "Alessandro Gorohovski" : >> Кому: Коваль Вячеслав (theathlet на yandex.ru); >> Копия: Moscow.pm group (moscow-pm на pm.org); >> Тема: [Moscow.pm] Узнать родительский ключ по ссылке; >> >> >> Вообще то передаётся ссылка (фактически адрес) >> >> \%{ $h{aa} } >> >> , а не просто значение. >> >> вт, 1 окт. 2024 г. в 14:37, Коваль Вячеслав : >> >> Для решения задачи все равно нужен доступ к исходному хэшу, т.к. в >> изначальном коде мы передаем уже обращаемся по ключу и в функцию уже >> передается значение, т.е. какой-то хэш или массив или значение. А чтобы >> получить ключ, то нужно рекурсивно пройтись по исходному хэшу и сравнить >> Scalar::Util::refaddr всех значений с исходным. >> >> ---------------- >> 01.10.2024, 13:47, "Alessandro Gorohovski via Moscow-pm" < >> moscow-pm на pm.org>: >> Кому: Moscow.pm group (moscow-pm на pm.org); >> Копия: Alessandro Gorohovski (an.gorohovski на gmail.com); >> Тема: [Moscow.pm] Узнать родительский ключ по ссылке; >> >> >> Нет, это не вариант. >> Функция не знает о хеше %h и его структуре, совсем не знает :) >> >> Представьте, что этот хеш может быть не 2х уровневый, а >> много-много-вложенный по уровням >> и >> $ref eq $value >> может случится на другом уровне. >> >> >> вт, 1 окт. 2024 г. в 13:03, Steffen Winkler via Moscow-pm < >> moscow-pm на pm.org>: >> >> use strict; >> use warnings; >> >> my %h = ( a => { b=> 1}, aa=> {bb=>2, }, ); >> >> sub where_key { >> my $ref = shift; >> >> while ( my ($key, $value) = each %h ) { >> $ref eq $value >> and return $key; >> } >> >> return; >> } >> >> my $k = where_key( $h{aa} ); >> print $k; >> exit; >> >> >> -- >> Moscow.pm mailing list >> moscow-pm на pm.org | http://moscow.pm.org >> >> ,-- >> Moscow.pm mailing list >> moscow-pm на pm.org | http://moscow.pm.org >> >> >> >> >> >> -- >> Яндекс.Почта — надёжная почта >> http://mail.yandex.ru/neo2/collect/?exp=1&t=1 >> >> >> >> >> >> -- >> Яндекс.Почта — надёжная почта >> http://mail.yandex.ru/neo2/collect/?exp=1&t=1 >> > -- > Moscow.pm mailing list > moscow-pm на pm.org | http://moscow.pm.org > ----------- следующая часть ----------- Вложение в формате HTML было извлечено… URL: From 0x62ash на gmail.com Tue Oct 1 13:14:49 2024 From: 0x62ash на gmail.com (Alexander Batyrshin) Date: Tue, 1 Oct 2024 23:14:49 +0300 Subject: [Moscow.pm] =?utf-8?b?0KPQt9C90LDRgtGMINGA0L7QtNC40YLQtdC70Yw=?= =?utf-8?b?0YHQutC40Lkg0LrQu9GO0Ycg0L/QviDRgdGB0YvQu9C60LU=?= In-Reply-To: References: Message-ID: Когда-то давно я юзала https://metacpan.org/pod/Data%3A%3AFind для поиска в сложных вложенных структурах. > On 1 Oct 2024, at 12:34, Alessandro Gorohovski via Moscow-pm wrote: > > Уважаемое сообщество, приветствую! > > Подскажите, может кто-нибудб знает/сталкивался: > существует ли способ узнать родительский ключ хеша по ссылке? > > # Например, есть хеш > my %h = ( a => { b=> 1}, aa=> {bb=>2, }, ); > > # вызов функции, где необходимо узнать родительский ключ > # например, 'aa' > my $k = &where_key( \%{ $h{aa} } ); > > exit; > > sub where_key { > my $sh = shift; > > my $k = ??? if ref( $sh ) eq 'HASH'; > > return $k; > } > -- > Moscow.pm mailing list > moscow-pm на pm.org | http://moscow.pm.org ----------- следующая часть ----------- Вложение в формате HTML было извлечено… URL: From an.gorohovski на gmail.com Tue Oct 1 23:22:07 2024 From: an.gorohovski на gmail.com (Alessandro Gorohovski) Date: Wed, 2 Oct 2024 09:22:07 +0300 Subject: [Moscow.pm] =?utf-8?b?0KPQt9C90LDRgtGMINGA0L7QtNC40YLQtdC70Yw=?= =?utf-8?b?0YHQutC40Lkg0LrQu9GO0Ycg0L/QviDRgdGB0YvQu9C60LU=?= In-Reply-To: References: Message-ID: Жаль, что не совсем по subject, но спасибо за "пищу для размышлений". вт, 1 окт. 2024 г. в 23:15, Alexander Batyrshin <0x62ash на gmail.com>: > Когда-то давно я юзала https://metacpan.org/pod/Data%3A%3AFind для поиска > в сложных вложенных структурах. > > > > On 1 Oct 2024, at 12:34, Alessandro Gorohovski via Moscow-pm < > moscow-pm на pm.org> wrote: > > Уважаемое сообщество, приветствую! > > Подскажите, может кто-нибудб знает/сталкивался: > существует ли способ узнать родительский ключ хеша по ссылке? > > # Например, есть хеш > my %h = ( a => { b=> 1}, aa=> {bb=>2, }, ); > > # вызов функции, где необходимо узнать родительский ключ > # например, 'aa' > my $k = &where_key( \%{ $h{aa} } ); > > exit; > > sub where_key { > my $sh = shift; > > my $k = ??? if ref( $sh ) eq 'HASH'; > > return $k; > } > -- > Moscow.pm mailing list > moscow-pm на pm.org | http://moscow.pm.org > > > ----------- следующая часть ----------- Вложение в формате HTML было извлечено… URL: From evdokimov.denis на gmail.com Wed Oct 2 04:17:52 2024 From: evdokimov.denis на gmail.com (Denis Evdokimov) Date: Wed, 2 Oct 2024 14:17:52 +0300 Subject: [Moscow.pm] =?utf-8?b?0KPQt9C90LDRgtGMINGA0L7QtNC40YLQtdC70Yw=?= =?utf-8?b?0YHQutC40Lkg0LrQu9GO0Ycg0L/QviDRgdGB0YvQu9C60LU=?= In-Reply-To: References: Message-ID: Это? ср, 2 окт. 2024 г. в 09:22, Alessandro Gorohovski via Moscow-pm < moscow-pm на pm.org>: > Жаль, что не совсем по subject, > но спасибо за "пищу для размышлений". > > > вт, 1 окт. 2024 г. в 23:15, Alexander Batyrshin <0x62ash на gmail.com>: > >> Когда-то давно я юзала https://metacpan.org/pod/Data%3A%3AFind для >> поиска в сложных вложенных структурах. >> >> >> >> On 1 Oct 2024, at 12:34, Alessandro Gorohovski via Moscow-pm < >> moscow-pm на pm.org> wrote: >> >> Уважаемое сообщество, приветствую! >> >> Подскажите, может кто-нибудб знает/сталкивался: >> существует ли способ узнать родительский ключ хеша по ссылке? >> >> # Например, есть хеш >> my %h = ( a => { b=> 1}, aa=> {bb=>2, }, ); >> >> # вызов функции, где необходимо узнать родительский ключ >> # например, 'aa' >> my $k = &where_key( \%{ $h{aa} } ); >> >> exit; >> >> sub where_key { >> my $sh = shift; >> >> my $k = ??? if ref( $sh ) eq 'HASH'; >> >> return $k; >> } >> -- >> 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 evdokimov.denis на gmail.com Wed Oct 2 04:18:01 2024 From: evdokimov.denis на gmail.com (Denis Evdokimov) Date: Wed, 2 Oct 2024 14:18:01 +0300 Subject: [Moscow.pm] =?utf-8?b?0KPQt9C90LDRgtGMINGA0L7QtNC40YLQtdC70Yw=?= =?utf-8?b?0YHQutC40Lkg0LrQu9GO0Ycg0L/QviDRgdGB0YvQu9C60LU=?= In-Reply-To: References: Message-ID: Это? #!/usr/bin/perl use 5.10.0; use strict; use warnings; use utf8; use open qw(:std :utf8); my %h = ( a => 1, b => 1, c => 1 ); say "a"; say findHashKey( \%h, $h{ a } ); say ""; say "b"; say findHashKey( \%h, $h{ b } ); say ""; say "c"; say findHashKey( \%h, $h{ c } ); ################################################################################ sub findHashKey { my $hash = shift; my $valueRef = \$_[ 0 ]; my $key; my $i = 0; foreach ( values %$hash ) { if ( $valueRef eq \$_ ) { foreach ( keys %$hash ) { $i-- == 0 or next; $key = $_; last; } last; } else { ++$i; } } return $key; } ################################################################################ ср, 2 окт. 2024 г. в 14:17, Denis Evdokimov : > Это? > > ср, 2 окт. 2024 г. в 09:22, Alessandro Gorohovski via Moscow-pm < > moscow-pm на pm.org>: > >> Жаль, что не совсем по subject, >> но спасибо за "пищу для размышлений". >> >> >> вт, 1 окт. 2024 г. в 23:15, Alexander Batyrshin <0x62ash на gmail.com>: >> >>> Когда-то давно я юзала https://metacpan.org/pod/Data%3A%3AFind для >>> поиска в сложных вложенных структурах. >>> >>> >>> >>> On 1 Oct 2024, at 12:34, Alessandro Gorohovski via Moscow-pm < >>> moscow-pm на pm.org> wrote: >>> >>> Уважаемое сообщество, приветствую! >>> >>> Подскажите, может кто-нибудб знает/сталкивался: >>> существует ли способ узнать родительский ключ хеша по ссылке? >>> >>> # Например, есть хеш >>> my %h = ( a => { b=> 1}, aa=> {bb=>2, }, ); >>> >>> # вызов функции, где необходимо узнать родительский ключ >>> # например, 'aa' >>> my $k = &where_key( \%{ $h{aa} } ); >>> >>> exit; >>> >>> sub where_key { >>> my $sh = shift; >>> >>> my $k = ??? if ref( $sh ) eq 'HASH'; >>> >>> return $k; >>> } >>> -- >>> 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 Fri Oct 4 00:02:10 2024 From: an.gorohovski на gmail.com (Alessandro Gorohovski) Date: Fri, 4 Oct 2024 10:02:10 +0300 Subject: [Moscow.pm] =?utf-8?b?0KPQt9C90LDRgtGMINGA0L7QtNC40YLQtdC70Yw=?= =?utf-8?b?0YHQutC40Lkg0LrQu9GO0Ycg0L/QviDRgdGB0YvQu9C60LU=?= In-Reply-To: References: Message-ID: Denis, приветствую! Извиняюсь за то, что отвечаю с опозданием. Был вовне. Действительно Ваш код хорош при определённых условиях, например, если передавать просто ссылку на хеш родителя и использовать это как ядро рекурсии. Премного благодарен. Только я ему сделал небольшую оптимизацию: убрал лишний внутренний цикл. Так пожалуй прозрачнее и быстрее будет работать. Вот что получилось: my %h = ( a => 1, b => 1, c => 1 ); say "a"; say findHashKey( \%h, $h{ a } ); say ""; say "b"; say findHashKey( \%h, $h{ b } ); say ""; say "c"; say findHashKey( \%h, $h{ c } ); sub findHashKey { my $hash = shift; my $v; for( %$hash ) { return $v if \$_[ 0 ] eq \$_; $v = $_; } } OUTPUT: a a b b c c ср, 2 окт. 2024 г. в 14:18, Denis Evdokimov : > Это? > > #!/usr/bin/perl > use 5.10.0; > use strict; > use warnings; > use utf8; > use open qw(:std :utf8); > > my %h = ( a => 1, b => 1, c => 1 ); > > say "a"; > say findHashKey( \%h, $h{ a } ); > say ""; > say "b"; > say findHashKey( \%h, $h{ b } ); > say ""; > say "c"; > say findHashKey( \%h, $h{ c } ); > > > ################################################################################ > sub findHashKey { > my $hash = shift; > my $valueRef = \$_[ 0 ]; > > my $key; > my $i = 0; > foreach ( values %$hash ) { > if ( $valueRef eq \$_ ) { > foreach ( keys %$hash ) { > $i-- == 0 or next; > $key = $_; > last; > } > last; > } > else { > ++$i; > } > } > return $key; > } > > ################################################################################ > > ср, 2 окт. 2024 г. в 14:17, Denis Evdokimov : > >> Это? >> >> ср, 2 окт. 2024 г. в 09:22, Alessandro Gorohovski via Moscow-pm < >> moscow-pm на pm.org>: >> >>> Жаль, что не совсем по subject, >>> но спасибо за "пищу для размышлений". >>> >>> >>> вт, 1 окт. 2024 г. в 23:15, Alexander Batyrshin <0x62ash на gmail.com>: >>> >>>> Когда-то давно я юзала https://metacpan.org/pod/Data%3A%3AFind для >>>> поиска в сложных вложенных структурах. >>>> >>>> >>>> >>>> On 1 Oct 2024, at 12:34, Alessandro Gorohovski via Moscow-pm < >>>> moscow-pm на pm.org> wrote: >>>> >>>> Уважаемое сообщество, приветствую! >>>> >>>> Подскажите, может кто-нибудб знает/сталкивался: >>>> существует ли способ узнать родительский ключ хеша по ссылке? >>>> >>>> # Например, есть хеш >>>> my %h = ( a => { b=> 1}, aa=> {bb=>2, }, ); >>>> >>>> # вызов функции, где необходимо узнать родительский ключ >>>> # например, 'aa' >>>> my $k = &where_key( \%{ $h{aa} } ); >>>> >>>> exit; >>>> >>>> sub where_key { >>>> my $sh = shift; >>>> >>>> my $k = ??? if ref( $sh ) eq 'HASH'; >>>> >>>> return $k; >>>> } >>>> -- >>>> 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 evdokimov.denis на gmail.com Fri Oct 4 02:23:24 2024 From: evdokimov.denis на gmail.com (Denis Evdokimov) Date: Fri, 4 Oct 2024 12:23:24 +0300 Subject: [Moscow.pm] =?utf-8?b?0KPQt9C90LDRgtGMINGA0L7QtNC40YLQtdC70Yw=?= =?utf-8?b?0YHQutC40Lkg0LrQu9GO0Ycg0L/QviDRgdGB0YvQu9C60LU=?= In-Reply-To: References: Message-ID: Это будет работать только на новых версиях. Если это допустимо, то так, конечно проще и понятнее пт, 4 окт. 2024 г., 10:02 Alessandro Gorohovski : > Denis, приветствую! > > Извиняюсь за то, что отвечаю с опозданием. > Был вовне. > > Действительно Ваш код хорош при определённых условиях, > например, если передавать просто ссылку на хеш родителя > и использовать это как ядро рекурсии. > Премного благодарен. > > Только я ему сделал небольшую оптимизацию: убрал лишний внутренний цикл. > Так пожалуй прозрачнее и быстрее будет работать. > Вот что получилось: > > my %h = ( a => 1, b => 1, c => 1 ); > say "a"; > say findHashKey( \%h, $h{ a } ); > say ""; > say "b"; > say findHashKey( \%h, $h{ b } ); > say ""; > say "c"; > say findHashKey( \%h, $h{ c } ); > > sub findHashKey { > my $hash = shift; > > my $v; > for( %$hash ) { > return $v if \$_[ 0 ] eq \$_; > $v = $_; > } > } > > OUTPUT: > a > a > > b > b > > c > c > > > ср, 2 окт. 2024 г. в 14:18, Denis Evdokimov : > >> Это? >> >> #!/usr/bin/perl >> use 5.10.0; >> use strict; >> use warnings; >> use utf8; >> use open qw(:std :utf8); >> >> my %h = ( a => 1, b => 1, c => 1 ); >> >> say "a"; >> say findHashKey( \%h, $h{ a } ); >> say ""; >> say "b"; >> say findHashKey( \%h, $h{ b } ); >> say ""; >> say "c"; >> say findHashKey( \%h, $h{ c } ); >> >> >> ################################################################################ >> sub findHashKey { >> my $hash = shift; >> my $valueRef = \$_[ 0 ]; >> >> my $key; >> my $i = 0; >> foreach ( values %$hash ) { >> if ( $valueRef eq \$_ ) { >> foreach ( keys %$hash ) { >> $i-- == 0 or next; >> $key = $_; >> last; >> } >> last; >> } >> else { >> ++$i; >> } >> } >> return $key; >> } >> >> ################################################################################ >> >> ср, 2 окт. 2024 г. в 14:17, Denis Evdokimov : >> >>> Это? >>> >>> ср, 2 окт. 2024 г. в 09:22, Alessandro Gorohovski via Moscow-pm < >>> moscow-pm на pm.org>: >>> >>>> Жаль, что не совсем по subject, >>>> но спасибо за "пищу для размышлений". >>>> >>>> >>>> вт, 1 окт. 2024 г. в 23:15, Alexander Batyrshin <0x62ash на gmail.com>: >>>> >>>>> Когда-то давно я юзала https://metacpan.org/pod/Data%3A%3AFind для >>>>> поиска в сложных вложенных структурах. >>>>> >>>>> >>>>> >>>>> On 1 Oct 2024, at 12:34, Alessandro Gorohovski via Moscow-pm < >>>>> moscow-pm на pm.org> wrote: >>>>> >>>>> Уважаемое сообщество, приветствую! >>>>> >>>>> Подскажите, может кто-нибудб знает/сталкивался: >>>>> существует ли способ узнать родительский ключ хеша по ссылке? >>>>> >>>>> # Например, есть хеш >>>>> my %h = ( a => { b=> 1}, aa=> {bb=>2, }, ); >>>>> >>>>> # вызов функции, где необходимо узнать родительский ключ >>>>> # например, 'aa' >>>>> my $k = &where_key( \%{ $h{aa} } ); >>>>> >>>>> exit; >>>>> >>>>> sub where_key { >>>>> my $sh = shift; >>>>> >>>>> my $k = ??? if ref( $sh ) eq 'HASH'; >>>>> >>>>> return $k; >>>>> } >>>>> -- >>>>> 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 Fri Oct 4 03:05:49 2024 From: dim0xff на gmail.com (Dmitry L.) Date: Fri, 4 Oct 2024 13:05:49 +0300 Subject: [Moscow.pm] =?utf-8?b?0KPQt9C90LDRgtGMINGA0L7QtNC40YLQtdC70Yw=?= =?utf-8?b?0YHQutC40Lkg0LrQu9GO0Ycg0L/QviDRgdGB0YvQu9C60LU=?= In-Reply-To: References: Message-ID: Почему только на новых? (и на сколько новых?). On Fri, 4 Oct 2024 at 12:23, Denis Evdokimov via Moscow-pm wrote: > > Это будет работать только на новых версиях. > Если это допустимо, то так, конечно проще и понятнее > > > пт, 4 окт. 2024 г., 10:02 Alessandro Gorohovski : >> >> Denis, приветствую! >> >> Извиняюсь за то, что отвечаю с опозданием. >> Был вовне. >> >> Действительно Ваш код хорош при определённых условиях, >> например, если передавать просто ссылку на хеш родителя >> и использовать это как ядро рекурсии. >> Премного благодарен. >> >> Только я ему сделал небольшую оптимизацию: убрал лишний внутренний цикл. >> Так пожалуй прозрачнее и быстрее будет работать. >> Вот что получилось: >> >> my %h = ( a => 1, b => 1, c => 1 ); >> say "a"; >> say findHashKey( \%h, $h{ a } ); >> say ""; >> say "b"; >> say findHashKey( \%h, $h{ b } ); >> say ""; >> say "c"; >> say findHashKey( \%h, $h{ c } ); >> >> sub findHashKey { >> my $hash = shift; >> >> my $v; >> for( %$hash ) { >> return $v if \$_[ 0 ] eq \$_; >> $v = $_; >> } >> } >> >> OUTPUT: >> a >> a >> >> b >> b >> >> c >> c >> >> >> ср, 2 окт. 2024 г. в 14:18, Denis Evdokimov : >>> >>> Это? >>> >>> #!/usr/bin/perl >>> use 5.10.0; >>> use strict; >>> use warnings; >>> use utf8; >>> use open qw(:std :utf8); >>> >>> my %h = ( a => 1, b => 1, c => 1 ); >>> >>> say "a"; >>> say findHashKey( \%h, $h{ a } ); >>> say ""; >>> say "b"; >>> say findHashKey( \%h, $h{ b } ); >>> say ""; >>> say "c"; >>> say findHashKey( \%h, $h{ c } ); >>> >>> ################################################################################ >>> sub findHashKey { >>> my $hash = shift; >>> my $valueRef = \$_[ 0 ]; >>> >>> my $key; >>> my $i = 0; >>> foreach ( values %$hash ) { >>> if ( $valueRef eq \$_ ) { >>> foreach ( keys %$hash ) { >>> $i-- == 0 or next; >>> $key = $_; >>> last; >>> } >>> last; >>> } >>> else { >>> ++$i; >>> } >>> } >>> return $key; >>> } >>> ################################################################################ >>> >>> ср, 2 окт. 2024 г. в 14:17, Denis Evdokimov : >>>> >>>> Это? >>>> >>>> ср, 2 окт. 2024 г. в 09:22, Alessandro Gorohovski via Moscow-pm : >>>>> >>>>> Жаль, что не совсем по subject, >>>>> но спасибо за "пищу для размышлений". >>>>> >>>>> >>>>> вт, 1 окт. 2024 г. в 23:15, Alexander Batyrshin <0x62ash на gmail.com>: >>>>>> >>>>>> Когда-то давно я юзала https://metacpan.org/pod/Data%3A%3AFind для поиска в сложных вложенных структурах. >>>>>> >>>>>> >>>>>> >>>>>> On 1 Oct 2024, at 12:34, Alessandro Gorohovski via Moscow-pm wrote: >>>>>> >>>>>> Уважаемое сообщество, приветствую! >>>>>> >>>>>> Подскажите, может кто-нибудб знает/сталкивался: >>>>>> существует ли способ узнать родительский ключ хеша по ссылке? >>>>>> >>>>>> # Например, есть хеш >>>>>> my %h = ( a => { b=> 1}, aa=> {bb=>2, }, ); >>>>>> >>>>>> # вызов функции, где необходимо узнать родительский ключ >>>>>> # например, 'aa' >>>>>> my $k = &where_key( \%{ $h{aa} } ); >>>>>> >>>>>> exit; >>>>>> >>>>>> sub where_key { >>>>>> my $sh = shift; >>>>>> >>>>>> my $k = ??? if ref( $sh ) eq 'HASH'; >>>>>> >>>>>> return $k; >>>>>> } >>>>>> -- >>>>>> Moscow.pm mailing list >>>>>> moscow-pm на pm.org | http://moscow.pm.org >>>>>> >>>>>> >>>>> -- >>>>> Moscow.pm mailing list >>>>> moscow-pm на pm.org | http://moscow.pm.org > > -- > Moscow.pm mailing list > moscow-pm на pm.org | http://moscow.pm.org -- //wbr, Dmitry L. From an.gorohovski на gmail.com Fri Oct 4 03:21:26 2024 From: an.gorohovski на gmail.com (Alessandro Gorohovski) Date: Fri, 4 Oct 2024 13:21:26 +0300 Subject: [Moscow.pm] =?utf-8?b?0KPQt9C90LDRgtGMINGA0L7QtNC40YLQtdC70Yw=?= =?utf-8?b?0YHQutC40Lkg0LrQu9GO0Ycg0L/QviDRgdGB0YvQu9C60LU=?= In-Reply-To: References: Message-ID: По всей видимости, Denis имел ввиду say но это не имеет отношение к функции А всё остально будет работать на старых тоже. :) Конечно, "положа руку на сердце", предложенная функция -- это вариация через for первоначального алгоритма через while, который предложил ув. Steffen Winkler sub where_key { my $ref = shift; while ( my ($key, $value) = each %h ) { $ref eq $value and return $key; } return; } Только с неявно заданным для функции хэшем. пт, 4 окт. 2024 г. в 13:06, Dmitry L. via Moscow-pm : > Почему только на новых? (и на сколько новых?). > > On Fri, 4 Oct 2024 at 12:23, Denis Evdokimov via Moscow-pm > wrote: > > > > Это будет работать только на новых версиях. > > Если это допустимо, то так, конечно проще и понятнее > > > > > > пт, 4 окт. 2024 г., 10:02 Alessandro Gorohovski >: > >> > >> Denis, приветствую! > >> > >> Извиняюсь за то, что отвечаю с опозданием. > >> Был вовне. > >> > >> Действительно Ваш код хорош при определённых условиях, > >> например, если передавать просто ссылку на хеш родителя > >> и использовать это как ядро рекурсии. > >> Премного благодарен. > >> > >> Только я ему сделал небольшую оптимизацию: убрал лишний внутренний цикл. > >> Так пожалуй прозрачнее и быстрее будет работать. > >> Вот что получилось: > >> > >> my %h = ( a => 1, b => 1, c => 1 ); > >> say "a"; > >> say findHashKey( \%h, $h{ a } ); > >> say ""; > >> say "b"; > >> say findHashKey( \%h, $h{ b } ); > >> say ""; > >> say "c"; > >> say findHashKey( \%h, $h{ c } ); > >> > >> sub findHashKey { > >> my $hash = shift; > >> > >> my $v; > >> for( %$hash ) { > >> return $v if \$_[ 0 ] eq \$_; > >> $v = $_; > >> } > >> } > >> > >> OUTPUT: > >> a > >> a > >> > >> b > >> b > >> > >> c > >> c > >> > >> > >> ср, 2 окт. 2024 г. в 14:18, Denis Evdokimov >: > >>> > >>> Это? > >>> > >>> #!/usr/bin/perl > >>> use 5.10.0; > >>> use strict; > >>> use warnings; > >>> use utf8; > >>> use open qw(:std :utf8); > >>> > >>> my %h = ( a => 1, b => 1, c => 1 ); > >>> > >>> say "a"; > >>> say findHashKey( \%h, $h{ a } ); > >>> say ""; > >>> say "b"; > >>> say findHashKey( \%h, $h{ b } ); > >>> say ""; > >>> say "c"; > >>> say findHashKey( \%h, $h{ c } ); > >>> > >>> > ################################################################################ > >>> sub findHashKey { > >>> my $hash = shift; > >>> my $valueRef = \$_[ 0 ]; > >>> > >>> my $key; > >>> my $i = 0; > >>> foreach ( values %$hash ) { > >>> if ( $valueRef eq \$_ ) { > >>> foreach ( keys %$hash ) { > >>> $i-- == 0 or next; > >>> $key = $_; > >>> last; > >>> } > >>> last; > >>> } > >>> else { > >>> ++$i; > >>> } > >>> } > >>> return $key; > >>> } > >>> > ################################################################################ > >>> > >>> ср, 2 окт. 2024 г. в 14:17, Denis Evdokimov >: > >>>> > >>>> Это? > >>>> > >>>> ср, 2 окт. 2024 г. в 09:22, Alessandro Gorohovski via Moscow-pm < > moscow-pm на pm.org>: > >>>>> > >>>>> Жаль, что не совсем по subject, > >>>>> но спасибо за "пищу для размышлений". > >>>>> > >>>>> > >>>>> вт, 1 окт. 2024 г. в 23:15, Alexander Batyrshin <0x62ash на gmail.com>: > >>>>>> > >>>>>> Когда-то давно я юзала https://metacpan.org/pod/Data%3A%3AFind для > поиска в сложных вложенных структурах. > >>>>>> > >>>>>> > >>>>>> > >>>>>> On 1 Oct 2024, at 12:34, Alessandro Gorohovski via Moscow-pm < > moscow-pm на pm.org> wrote: > >>>>>> > >>>>>> Уважаемое сообщество, приветствую! > >>>>>> > >>>>>> Подскажите, может кто-нибудб знает/сталкивался: > >>>>>> существует ли способ узнать родительский ключ хеша по ссылке? > >>>>>> > >>>>>> # Например, есть хеш > >>>>>> my %h = ( a => { b=> 1}, aa=> {bb=>2, }, ); > >>>>>> > >>>>>> # вызов функции, где необходимо узнать родительский ключ > >>>>>> # например, 'aa' > >>>>>> my $k = &where_key( \%{ $h{aa} } ); > >>>>>> > >>>>>> exit; > >>>>>> > >>>>>> sub where_key { > >>>>>> my $sh = shift; > >>>>>> > >>>>>> my $k = ??? if ref( $sh ) eq 'HASH'; > >>>>>> > >>>>>> return $k; > >>>>>> } > >>>>>> -- > >>>>>> Moscow.pm mailing list > >>>>>> moscow-pm на pm.org | http://moscow.pm.org > >>>>>> > >>>>>> > >>>>> -- > >>>>> Moscow.pm mailing list > >>>>> moscow-pm на pm.org | http://moscow.pm.org > > > > -- > > Moscow.pm mailing list > > moscow-pm на pm.org | http://moscow.pm.org > > > > -- > //wbr, Dmitry L. > -- > Moscow.pm mailing list > moscow-pm на pm.org | http://moscow.pm.org > ----------- следующая часть ----------- Вложение в формате HTML было извлечено… URL: From mons на cpan.org Fri Oct 4 03:35:33 2024 From: mons на cpan.org (Mons Anderson) Date: Fri, 4 Oct 2024 13:35:33 +0300 Subject: [Moscow.pm] =?utf-8?b?0KPQt9C90LDRgtGMINGA0L7QtNC40YLQtdC70Yw=?= =?utf-8?b?0YHQutC40Lkg0LrQu9GO0Ycg0L/QviDRgdGB0YvQu9C60LU=?= In-Reply-To: References: Message-ID: On Fri, Oct 4, 2024 at 1:21 PM Alessandro Gorohovski via Moscow-pm < moscow-pm на pm.org> wrote: > По всей видимости, Denis имел ввиду > say > но это не имеет отношение к функции > > А всё остально будет работать на старых тоже. > :) > > Конечно, "положа руку на сердце", предложенная функция -- это вариация > через for > первоначального алгоритма через while, который предложил ув. > Steffen Winkler > sub where_key { > my $ref = shift; > while ( my ($key, $value) = each %h ) { > откуда тут возьмётся %h? $ref eq $value > это неверное сравнение. переменные могут быть равны по строковому значению, но быть разными переменными. \$ref == \$value более правильное. > > and return $key; > } > return; > } > А вообще имхо вся эта затея полный бред. Значение не несёт в себе информации о том, кто и откуда на него ссылается. Поэтому только по значению такой поиск не может считаться корректным. Только с передачей хэша в котором ищем это имеет смысл. > Только с неявно заданным для функции хэшем. > > пт, 4 окт. 2024 г. в 13:06, Dmitry L. via Moscow-pm : > >> Почему только на новых? (и на сколько новых?). >> >> On Fri, 4 Oct 2024 at 12:23, Denis Evdokimov via Moscow-pm >> wrote: >> > >> > Это будет работать только на новых версиях. >> > Если это допустимо, то так, конечно проще и понятнее >> > >> > >> > пт, 4 окт. 2024 г., 10:02 Alessandro Gorohovski < >> an.gorohovski на gmail.com>: >> >> >> >> Denis, приветствую! >> >> >> >> Извиняюсь за то, что отвечаю с опозданием. >> >> Был вовне. >> >> >> >> Действительно Ваш код хорош при определённых условиях, >> >> например, если передавать просто ссылку на хеш родителя >> >> и использовать это как ядро рекурсии. >> >> Премного благодарен. >> >> >> >> Только я ему сделал небольшую оптимизацию: убрал лишний внутренний >> цикл. >> >> Так пожалуй прозрачнее и быстрее будет работать. >> >> Вот что получилось: >> >> >> >> my %h = ( a => 1, b => 1, c => 1 ); >> >> say "a"; >> >> say findHashKey( \%h, $h{ a } ); >> >> say ""; >> >> say "b"; >> >> say findHashKey( \%h, $h{ b } ); >> >> say ""; >> >> say "c"; >> >> say findHashKey( \%h, $h{ c } ); >> >> >> >> sub findHashKey { >> >> my $hash = shift; >> >> >> >> my $v; >> >> for( %$hash ) { >> >> return $v if \$_[ 0 ] eq \$_; >> >> $v = $_; >> >> } >> >> } >> >> >> >> OUTPUT: >> >> a >> >> a >> >> >> >> b >> >> b >> >> >> >> c >> >> c >> >> >> >> >> >> ср, 2 окт. 2024 г. в 14:18, Denis Evdokimov > >: >> >>> >> >>> Это? >> >>> >> >>> #!/usr/bin/perl >> >>> use 5.10.0; >> >>> use strict; >> >>> use warnings; >> >>> use utf8; >> >>> use open qw(:std :utf8); >> >>> >> >>> my %h = ( a => 1, b => 1, c => 1 ); >> >>> >> >>> say "a"; >> >>> say findHashKey( \%h, $h{ a } ); >> >>> say ""; >> >>> say "b"; >> >>> say findHashKey( \%h, $h{ b } ); >> >>> say ""; >> >>> say "c"; >> >>> say findHashKey( \%h, $h{ c } ); >> >>> >> >>> >> ################################################################################ >> >>> sub findHashKey { >> >>> my $hash = shift; >> >>> my $valueRef = \$_[ 0 ]; >> >>> >> >>> my $key; >> >>> my $i = 0; >> >>> foreach ( values %$hash ) { >> >>> if ( $valueRef eq \$_ ) { >> >>> foreach ( keys %$hash ) { >> >>> $i-- == 0 or next; >> >>> $key = $_; >> >>> last; >> >>> } >> >>> last; >> >>> } >> >>> else { >> >>> ++$i; >> >>> } >> >>> } >> >>> return $key; >> >>> } >> >>> >> ################################################################################ >> >>> >> >>> ср, 2 окт. 2024 г. в 14:17, Denis Evdokimov < >> evdokimov.denis на gmail.com>: >> >>>> >> >>>> Это? >> >>>> >> >>>> ср, 2 окт. 2024 г. в 09:22, Alessandro Gorohovski via Moscow-pm < >> moscow-pm на pm.org>: >> >>>>> >> >>>>> Жаль, что не совсем по subject, >> >>>>> но спасибо за "пищу для размышлений". >> >>>>> >> >>>>> >> >>>>> вт, 1 окт. 2024 г. в 23:15, Alexander Batyrshin <0x62ash на gmail.com >> >: >> >>>>>> >> >>>>>> Когда-то давно я юзала https://metacpan.org/pod/Data%3A%3AFind >> для поиска в сложных вложенных структурах. >> >>>>>> >> >>>>>> >> >>>>>> >> >>>>>> On 1 Oct 2024, at 12:34, Alessandro Gorohovski via Moscow-pm < >> moscow-pm на pm.org> wrote: >> >>>>>> >> >>>>>> Уважаемое сообщество, приветствую! >> >>>>>> >> >>>>>> Подскажите, может кто-нибудб знает/сталкивался: >> >>>>>> существует ли способ узнать родительский ключ хеша по ссылке? >> >>>>>> >> >>>>>> # Например, есть хеш >> >>>>>> my %h = ( a => { b=> 1}, aa=> {bb=>2, }, ); >> >>>>>> >> >>>>>> # вызов функции, где необходимо узнать родительский ключ >> >>>>>> # например, 'aa' >> >>>>>> my $k = &where_key( \%{ $h{aa} } ); >> >>>>>> >> >>>>>> exit; >> >>>>>> >> >>>>>> sub where_key { >> >>>>>> my $sh = shift; >> >>>>>> >> >>>>>> my $k = ??? if ref( $sh ) eq 'HASH'; >> >>>>>> >> >>>>>> return $k; >> >>>>>> } >> >>>>>> -- >> >>>>>> Moscow.pm mailing list >> >>>>>> moscow-pm на pm.org | http://moscow.pm.org >> >>>>>> >> >>>>>> >> >>>>> -- >> >>>>> Moscow.pm mailing list >> >>>>> moscow-pm на pm.org | http://moscow.pm.org >> > >> > -- >> > Moscow.pm mailing list >> > moscow-pm на pm.org | http://moscow.pm.org >> >> >> >> -- >> //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 mons на cpan.org Fri Oct 4 05:35:04 2024 From: mons на cpan.org (Mons Anderson) Date: Fri, 4 Oct 2024 15:35:04 +0300 Subject: [Moscow.pm] =?utf-8?b?0KPQt9C90LDRgtGMINGA0L7QtNC40YLQtdC70Yw=?= =?utf-8?b?0YHQutC40Lkg0LrQu9GO0Ycg0L/QviDRgdGB0YvQu9C60LU=?= In-Reply-To: References: Message-ID: Но если это с целью исследования, а не для прода, то можно поиграться с internals use 5.016; use DDP; use Devel::Peek; use PadWalker ':all'; my %h_my = (a => 1, b => 1); our %h_our = (a => 1, b => 1); my $r_my = {a => 1, b => 1}; our $r_our = {a => 1, b => 1}; detect($h_my{a}); detect($h_our{b}); detect($r_my->{a}); detect($r_our->{b}); sub detect { my $what = \shift; say "searching for $what: [$$what]"; # Dump($$what); for my $vars ( peek_my(1), peek_our(1), ) { while (my ($name, $ref) = each %$vars){ $ref = $$ref if ref $ref eq 'REF'; if (ref $ref eq 'HASH') { while (my ($key, $val) = each %$ref){ # say "$name -> $key :"; # Dump($val); if (\$ref->{$key} == $what) { say "found ref $what in $name as $key"; return; } } } } } } Best wishes, Mons On Fri, Oct 4, 2024 at 1:35 PM Mons Anderson wrote: > On Fri, Oct 4, 2024 at 1:21 PM Alessandro Gorohovski via Moscow-pm < > moscow-pm на pm.org> wrote: > >> По всей видимости, Denis имел ввиду >> say >> но это не имеет отношение к функции >> >> А всё остально будет работать на старых тоже. >> :) >> >> Конечно, "положа руку на сердце", предложенная функция -- это вариация >> через for >> первоначального алгоритма через while, который предложил ув. >> Steffen Winkler >> sub where_key { >> my $ref = shift; >> while ( my ($key, $value) = each %h ) { >> > > откуда тут возьмётся %h? > > $ref eq $value >> > > это неверное сравнение. > переменные могут быть равны по строковому значению, но быть разными > переменными. > \$ref == \$value более правильное. > > >> >> and return $key; >> } >> return; >> } >> > > А вообще имхо вся эта затея полный бред. > Значение не несёт в себе информации о том, кто и откуда на него ссылается. > Поэтому только по значению такой поиск не может считаться корректным. > Только с передачей хэша в котором ищем это имеет смысл. > > >> Только с неявно заданным для функции хэшем. >> >> пт, 4 окт. 2024 г. в 13:06, Dmitry L. via Moscow-pm : >> >>> Почему только на новых? (и на сколько новых?). >>> >>> On Fri, 4 Oct 2024 at 12:23, Denis Evdokimov via Moscow-pm >>> wrote: >>> > >>> > Это будет работать только на новых версиях. >>> > Если это допустимо, то так, конечно проще и понятнее >>> > >>> > >>> > пт, 4 окт. 2024 г., 10:02 Alessandro Gorohovski < >>> an.gorohovski на gmail.com>: >>> >> >>> >> Denis, приветствую! >>> >> >>> >> Извиняюсь за то, что отвечаю с опозданием. >>> >> Был вовне. >>> >> >>> >> Действительно Ваш код хорош при определённых условиях, >>> >> например, если передавать просто ссылку на хеш родителя >>> >> и использовать это как ядро рекурсии. >>> >> Премного благодарен. >>> >> >>> >> Только я ему сделал небольшую оптимизацию: убрал лишний внутренний >>> цикл. >>> >> Так пожалуй прозрачнее и быстрее будет работать. >>> >> Вот что получилось: >>> >> >>> >> my %h = ( a => 1, b => 1, c => 1 ); >>> >> say "a"; >>> >> say findHashKey( \%h, $h{ a } ); >>> >> say ""; >>> >> say "b"; >>> >> say findHashKey( \%h, $h{ b } ); >>> >> say ""; >>> >> say "c"; >>> >> say findHashKey( \%h, $h{ c } ); >>> >> >>> >> sub findHashKey { >>> >> my $hash = shift; >>> >> >>> >> my $v; >>> >> for( %$hash ) { >>> >> return $v if \$_[ 0 ] eq \$_; >>> >> $v = $_; >>> >> } >>> >> } >>> >> >>> >> OUTPUT: >>> >> a >>> >> a >>> >> >>> >> b >>> >> b >>> >> >>> >> c >>> >> c >>> >> >>> >> >>> >> ср, 2 окт. 2024 г. в 14:18, Denis Evdokimov < >>> evdokimov.denis на gmail.com>: >>> >>> >>> >>> Это? >>> >>> >>> >>> #!/usr/bin/perl >>> >>> use 5.10.0; >>> >>> use strict; >>> >>> use warnings; >>> >>> use utf8; >>> >>> use open qw(:std :utf8); >>> >>> >>> >>> my %h = ( a => 1, b => 1, c => 1 ); >>> >>> >>> >>> say "a"; >>> >>> say findHashKey( \%h, $h{ a } ); >>> >>> say ""; >>> >>> say "b"; >>> >>> say findHashKey( \%h, $h{ b } ); >>> >>> say ""; >>> >>> say "c"; >>> >>> say findHashKey( \%h, $h{ c } ); >>> >>> >>> >>> >>> ################################################################################ >>> >>> sub findHashKey { >>> >>> my $hash = shift; >>> >>> my $valueRef = \$_[ 0 ]; >>> >>> >>> >>> my $key; >>> >>> my $i = 0; >>> >>> foreach ( values %$hash ) { >>> >>> if ( $valueRef eq \$_ ) { >>> >>> foreach ( keys %$hash ) { >>> >>> $i-- == 0 or next; >>> >>> $key = $_; >>> >>> last; >>> >>> } >>> >>> last; >>> >>> } >>> >>> else { >>> >>> ++$i; >>> >>> } >>> >>> } >>> >>> return $key; >>> >>> } >>> >>> >>> ################################################################################ >>> >>> >>> >>> ср, 2 окт. 2024 г. в 14:17, Denis Evdokimov < >>> evdokimov.denis на gmail.com>: >>> >>>> >>> >>>> Это? >>> >>>> >>> >>>> ср, 2 окт. 2024 г. в 09:22, Alessandro Gorohovski via Moscow-pm < >>> moscow-pm на pm.org>: >>> >>>>> >>> >>>>> Жаль, что не совсем по subject, >>> >>>>> но спасибо за "пищу для размышлений". >>> >>>>> >>> >>>>> >>> >>>>> вт, 1 окт. 2024 г. в 23:15, Alexander Batyrshin <0x62ash на gmail.com >>> >: >>> >>>>>> >>> >>>>>> Когда-то давно я юзала https://metacpan.org/pod/Data%3A%3AFind >>> для поиска в сложных вложенных структурах. >>> >>>>>> >>> >>>>>> >>> >>>>>> >>> >>>>>> On 1 Oct 2024, at 12:34, Alessandro Gorohovski via Moscow-pm < >>> moscow-pm на pm.org> wrote: >>> >>>>>> >>> >>>>>> Уважаемое сообщество, приветствую! >>> >>>>>> >>> >>>>>> Подскажите, может кто-нибудб знает/сталкивался: >>> >>>>>> существует ли способ узнать родительский ключ хеша по ссылке? >>> >>>>>> >>> >>>>>> # Например, есть хеш >>> >>>>>> my %h = ( a => { b=> 1}, aa=> {bb=>2, }, ); >>> >>>>>> >>> >>>>>> # вызов функции, где необходимо узнать родительский ключ >>> >>>>>> # например, 'aa' >>> >>>>>> my $k = &where_key( \%{ $h{aa} } ); >>> >>>>>> >>> >>>>>> exit; >>> >>>>>> >>> >>>>>> sub where_key { >>> >>>>>> my $sh = shift; >>> >>>>>> >>> >>>>>> my $k = ??? if ref( $sh ) eq 'HASH'; >>> >>>>>> >>> >>>>>> return $k; >>> >>>>>> } >>> >>>>>> -- >>> >>>>>> Moscow.pm mailing list >>> >>>>>> moscow-pm на pm.org | http://moscow.pm.org >>> >>>>>> >>> >>>>>> >>> >>>>> -- >>> >>>>> Moscow.pm mailing list >>> >>>>> moscow-pm на pm.org | http://moscow.pm.org >>> > >>> > -- >>> > Moscow.pm mailing list >>> > moscow-pm на pm.org | http://moscow.pm.org >>> >>> >>> >>> -- >>> //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 Fri Oct 4 05:49:39 2024 From: an.gorohovski на gmail.com (Alessandro Gorohovski) Date: Fri, 4 Oct 2024 15:49:39 +0300 Subject: [Moscow.pm] =?utf-8?b?0KPQt9C90LDRgtGMINGA0L7QtNC40YLQtdC70Yw=?= =?utf-8?b?0YHQutC40Lkg0LrQu9GO0Ycg0L/QviDRgdGB0YvQu9C60LU=?= In-Reply-To: References: Message-ID: пт, 4 окт. 2024 г. в 13:35, Mons Anderson : > On Fri, Oct 4, 2024 at 1:21 PM Alessandro Gorohovski via Moscow-pm < > moscow-pm на pm.org> wrote: > >> По всей видимости, Denis имел ввиду >> say >> но это не имеет отношение к функции >> >> А всё остально будет работать на старых тоже. >> :) >> >> Конечно, "положа руку на сердце", предложенная функция -- это вариация >> через for >> первоначального алгоритма через while, который предложил ув. >> Steffen Winkler >> sub where_key { >> my $ref = shift; >> while ( my ($key, $value) = each %h ) { >> > > откуда тут возьмётся %h? > > $ref eq $value >> > > это неверное сравнение. > переменные могут быть равны по строковому значению, но быть разными > переменными. > \$ref == \$value более правильное. > Да, конечно первоначальный вариант с while не совсем корректно отработает на таком случае my %h = ( a => { b=> 1}, aa=> {bb=>2, ac=>2, ab=>2, }, ); sub where_key { my $hash = shift; my $ref = shift; while( my ($key, $value) = each %$hash ) { $ref eq $value and return $key; } } say where_key( $h{aa}, $h{aa}{bb} ); может выдать не только ожидаемый bb , а любой из ab ac bb Вот поэтому и предложил другой вариант с for sub where_key { my $hash = shift; my $v; for( %$hash ) { return $v if \$_[ 0 ] eq \$_; $v = $_; } } > > >> >> and return $key; >> } >> return; >> } >> > > А вообще имхо вся эта затея полный бред. > Кому как. > Значение не несёт в себе информации о том, кто и откуда на него ссылается. > Поэтому только по значению такой поиск не может считаться корректным. > Только с передачей хэша в котором ищем это имеет смысл. > Вообще здесь вопрос звучит более широко: Как зная ссылку на переменную (scalar, array or hash) найти её название? Perl интерпретатор как то же находит, справляется с этим. > > >> Только с неявно заданным для функции хэшем. >> >> пт, 4 окт. 2024 г. в 13:06, Dmitry L. via Moscow-pm : >> >>> Почему только на новых? (и на сколько новых?). >>> >>> On Fri, 4 Oct 2024 at 12:23, Denis Evdokimov via Moscow-pm >>> wrote: >>> > >>> > Это будет работать только на новых версиях. >>> > Если это допустимо, то так, конечно проще и понятнее >>> > >>> > >>> > пт, 4 окт. 2024 г., 10:02 Alessandro Gorohovski < >>> an.gorohovski на gmail.com>: >>> >> >>> >> Denis, приветствую! >>> >> >>> >> Извиняюсь за то, что отвечаю с опозданием. >>> >> Был вовне. >>> >> >>> >> Действительно Ваш код хорош при определённых условиях, >>> >> например, если передавать просто ссылку на хеш родителя >>> >> и использовать это как ядро рекурсии. >>> >> Премного благодарен. >>> >> >>> >> Только я ему сделал небольшую оптимизацию: убрал лишний внутренний >>> цикл. >>> >> Так пожалуй прозрачнее и быстрее будет работать. >>> >> Вот что получилось: >>> >> >>> >> my %h = ( a => 1, b => 1, c => 1 ); >>> >> say "a"; >>> >> say findHashKey( \%h, $h{ a } ); >>> >> say ""; >>> >> say "b"; >>> >> say findHashKey( \%h, $h{ b } ); >>> >> say ""; >>> >> say "c"; >>> >> say findHashKey( \%h, $h{ c } ); >>> >> >>> >> sub findHashKey { >>> >> my $hash = shift; >>> >> >>> >> my $v; >>> >> for( %$hash ) { >>> >> return $v if \$_[ 0 ] eq \$_; >>> >> $v = $_; >>> >> } >>> >> } >>> >> >>> >> OUTPUT: >>> >> a >>> >> a >>> >> >>> >> b >>> >> b >>> >> >>> >> c >>> >> c >>> >> >>> >> >>> >> ср, 2 окт. 2024 г. в 14:18, Denis Evdokimov < >>> evdokimov.denis на gmail.com>: >>> >>> >>> >>> Это? >>> >>> >>> >>> #!/usr/bin/perl >>> >>> use 5.10.0; >>> >>> use strict; >>> >>> use warnings; >>> >>> use utf8; >>> >>> use open qw(:std :utf8); >>> >>> >>> >>> my %h = ( a => 1, b => 1, c => 1 ); >>> >>> >>> >>> say "a"; >>> >>> say findHashKey( \%h, $h{ a } ); >>> >>> say ""; >>> >>> say "b"; >>> >>> say findHashKey( \%h, $h{ b } ); >>> >>> say ""; >>> >>> say "c"; >>> >>> say findHashKey( \%h, $h{ c } ); >>> >>> >>> >>> >>> ################################################################################ >>> >>> sub findHashKey { >>> >>> my $hash = shift; >>> >>> my $valueRef = \$_[ 0 ]; >>> >>> >>> >>> my $key; >>> >>> my $i = 0; >>> >>> foreach ( values %$hash ) { >>> >>> if ( $valueRef eq \$_ ) { >>> >>> foreach ( keys %$hash ) { >>> >>> $i-- == 0 or next; >>> >>> $key = $_; >>> >>> last; >>> >>> } >>> >>> last; >>> >>> } >>> >>> else { >>> >>> ++$i; >>> >>> } >>> >>> } >>> >>> return $key; >>> >>> } >>> >>> >>> ################################################################################ >>> >>> >>> >>> ср, 2 окт. 2024 г. в 14:17, Denis Evdokimov < >>> evdokimov.denis на gmail.com>: >>> >>>> >>> >>>> Это? >>> >>>> >>> >>>> ср, 2 окт. 2024 г. в 09:22, Alessandro Gorohovski via Moscow-pm < >>> moscow-pm на pm.org>: >>> >>>>> >>> >>>>> Жаль, что не совсем по subject, >>> >>>>> но спасибо за "пищу для размышлений". >>> >>>>> >>> >>>>> >>> >>>>> вт, 1 окт. 2024 г. в 23:15, Alexander Batyrshin <0x62ash на gmail.com >>> >: >>> >>>>>> >>> >>>>>> Когда-то давно я юзала https://metacpan.org/pod/Data%3A%3AFind >>> для поиска в сложных вложенных структурах. >>> >>>>>> >>> >>>>>> >>> >>>>>> >>> >>>>>> On 1 Oct 2024, at 12:34, Alessandro Gorohovski via Moscow-pm < >>> moscow-pm на pm.org> wrote: >>> >>>>>> >>> >>>>>> Уважаемое сообщество, приветствую! >>> >>>>>> >>> >>>>>> Подскажите, может кто-нибудб знает/сталкивался: >>> >>>>>> существует ли способ узнать родительский ключ хеша по ссылке? >>> >>>>>> >>> >>>>>> # Например, есть хеш >>> >>>>>> my %h = ( a => { b=> 1}, aa=> {bb=>2, }, ); >>> >>>>>> >>> >>>>>> # вызов функции, где необходимо узнать родительский ключ >>> >>>>>> # например, 'aa' >>> >>>>>> my $k = &where_key( \%{ $h{aa} } ); >>> >>>>>> >>> >>>>>> exit; >>> >>>>>> >>> >>>>>> sub where_key { >>> >>>>>> my $sh = shift; >>> >>>>>> >>> >>>>>> my $k = ??? if ref( $sh ) eq 'HASH'; >>> >>>>>> >>> >>>>>> return $k; >>> >>>>>> } >>> >>>>>> -- >>> >>>>>> Moscow.pm mailing list >>> >>>>>> moscow-pm на pm.org | http://moscow.pm.org >>> >>>>>> >>> >>>>>> >>> >>>>> -- >>> >>>>> Moscow.pm mailing list >>> >>>>> moscow-pm на pm.org | http://moscow.pm.org >>> > >>> > -- >>> > Moscow.pm mailing list >>> > moscow-pm на pm.org | http://moscow.pm.org >>> >>> >>> >>> -- >>> //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 mons на cpan.org Fri Oct 4 06:20:41 2024 From: mons на cpan.org (Mons Anderson) Date: Fri, 4 Oct 2024 16:20:41 +0300 Subject: [Moscow.pm] =?utf-8?b?0KPQt9C90LDRgtGMINGA0L7QtNC40YLQtdC70Yw=?= =?utf-8?b?0YHQutC40Lkg0LrQu9GO0Ycg0L/QviDRgdGB0YvQu9C60LU=?= In-Reply-To: References: Message-ID: On Fri, Oct 4, 2024 at 3:50 PM Alessandro Gorohovski via Moscow-pm < moscow-pm на pm.org> wrote: > > > пт, 4 окт. 2024 г. в 13:35, Mons Anderson : > >> On Fri, Oct 4, 2024 at 1:21 PM Alessandro Gorohovski via Moscow-pm < >> moscow-pm на pm.org> wrote: >> >>> По всей видимости, Denis имел ввиду >>> say >>> но это не имеет отношение к функции >>> >>> А всё остально будет работать на старых тоже. >>> :) >>> >>> Конечно, "положа руку на сердце", предложенная функция -- это вариация >>> через for >>> первоначального алгоритма через while, который предложил ув. >>> Steffen Winkler >>> sub where_key { >>> my $ref = shift; >>> while ( my ($key, $value) = each %h ) { >>> >> >> откуда тут возьмётся %h? >> >> $ref eq $value >>> >> >> это неверное сравнение. >> переменные могут быть равны по строковому значению, но быть разными >> переменными. >> \$ref == \$value более правильное. >> > > Да, конечно первоначальный вариант с while > не совсем корректно отработает на таком случае > > my %h = ( a => { b=> 1}, aa=> {bb=>2, ac=>2, ab=>2, }, ); > > sub where_key { > my $hash = shift; > my $ref = shift; > while( my ($key, $value) = each %$hash ) { > $ref eq $value and return $key; > } > } > > say where_key( $h{aa}, $h{aa}{bb} ); > > может выдать не только ожидаемый bb , а любой из > ab > ac > bb > > Вот поэтому и предложил другой вариант с for > > sub where_key { > my $hash = shift; > my $v; > for( %$hash ) { > return $v if \$_[ 0 ] eq \$_; > $v = $_; > } > } > > > > >> >> >>> >>> and return $key; >>> } >>> return; >>> } >>> >> >> А вообще имхо вся эта затея полный бред. >> > > Кому как. > > > >> Значение не несёт в себе информации о том, кто и откуда на него ссылается. >> Поэтому только по значению такой поиск не может считаться корректным. >> Только с передачей хэша в котором ищем это имеет смысл. >> > > Вообще здесь вопрос звучит более широко: > > Как зная ссылку на переменную (scalar, array or hash) найти её название? > Perl интерпретатор как то же находит, справляется с этим. > Perl никак не справляется с этим. Значение не имеет имени. Оно имеет >= 1 ссылок на себя, каждая из которых равнозначно является её именем. Можно иметь на одну и ту же переменную ссылки из нескольких источников. И никакая из ссылок не является её "именем". Так что если поставить вопрос правильно, то задача начинает иметь смысл. Например: - как найти все ссылки на переменную? Я постарался подобрать решение исходя из поставленной задачи (по какой из ссылок переменную передали (скорее всего), если исходить из того, что она была передана из хэша. Поскольку мы обращались к хэшу прямо перед вызовом, это значит, что padwalker увидит переменную на один стекфрейм выше. > ----------- следующая часть ----------- Вложение в формате HTML было извлечено… URL: From ivan на serezhkin.com Fri Oct 4 06:36:03 2024 From: ivan на serezhkin.com (Ivan Serezhkin) Date: Fri, 04 Oct 2024 17:36:03 +0400 Subject: [Moscow.pm] =?utf-8?b?0KPQt9C90LDRgtGMINGA0L7QtNC40YLQtdC70Yw=?= =?utf-8?b?0YHQutC40Lkg0LrQu9GO0Ycg0L/QviDRgdGB0YvQu9C60LU=?= In-Reply-To: References: Message-ID: <116001728047910@mail.yandex.ru> Вложение в формате HTML было извлечено… URL: From an.gorohovski на gmail.com Fri Oct 4 06:45:48 2024 From: an.gorohovski на gmail.com (Alessandro Gorohovski) Date: Fri, 4 Oct 2024 16:45:48 +0300 Subject: [Moscow.pm] =?utf-8?b?0KPQt9C90LDRgtGMINGA0L7QtNC40YLQtdC70Yw=?= =?utf-8?b?0YHQutC40Lkg0LrQu9GO0Ycg0L/QviDRgdGB0YvQu9C60LU=?= In-Reply-To: References: Message-ID: пт, 4 окт. 2024 г. в 16:20, Mons Anderson : > On Fri, Oct 4, 2024 at 3:50 PM Alessandro Gorohovski via Moscow-pm < > moscow-pm на pm.org> wrote: > >> >> >> пт, 4 окт. 2024 г. в 13:35, Mons Anderson : >> >>> On Fri, Oct 4, 2024 at 1:21 PM Alessandro Gorohovski via Moscow-pm < >>> moscow-pm на pm.org> wrote: >>> >>>> По всей видимости, Denis имел ввиду >>>> say >>>> но это не имеет отношение к функции >>>> >>>> А всё остально будет работать на старых тоже. >>>> :) >>>> >>>> Конечно, "положа руку на сердце", предложенная функция -- это вариация >>>> через for >>>> первоначального алгоритма через while, который предложил ув. >>>> Steffen Winkler >>>> sub where_key { >>>> my $ref = shift; >>>> while ( my ($key, $value) = each %h ) { >>>> >>> >>> откуда тут возьмётся %h? >>> >>> $ref eq $value >>>> >>> >>> это неверное сравнение. >>> переменные могут быть равны по строковому значению, но быть разными >>> переменными. >>> \$ref == \$value более правильное. >>> >> >> Да, конечно первоначальный вариант с while >> не совсем корректно отработает на таком случае >> >> my %h = ( a => { b=> 1}, aa=> {bb=>2, ac=>2, ab=>2, }, ); >> >> sub where_key { >> my $hash = shift; >> my $ref = shift; >> while( my ($key, $value) = each %$hash ) { >> $ref eq $value and return $key; >> } >> } >> >> say where_key( $h{aa}, $h{aa}{bb} ); >> >> может выдать не только ожидаемый bb , а любой из >> ab >> ac >> bb >> >> Вот поэтому и предложил другой вариант с for >> >> sub where_key { >> my $hash = shift; >> my $v; >> for( %$hash ) { >> return $v if \$_[ 0 ] eq \$_; >> $v = $_; >> } >> } >> >> >> >> >>> >>> >>>> >>>> and return $key; >>>> } >>>> return; >>>> } >>>> >>> >>> А вообще имхо вся эта затея полный бред. >>> >> >> Кому как. >> >> >> >>> Значение не несёт в себе информации о том, кто и откуда на него >>> ссылается. >>> Поэтому только по значению такой поиск не может считаться корректным. >>> Только с передачей хэша в котором ищем это имеет смысл. >>> >> >> Вообще здесь вопрос звучит более широко: >> >> Как зная ссылку на переменную (scalar, array or hash) найти её название? >> Perl интерпретатор как то же находит, справляется с этим. >> > > Perl никак не справляется с этим. Значение не имеет имени. Оно имеет >= 1 > ссылок на себя, каждая из которых равнозначно является её именем. Можно > иметь на одну и ту же переменную ссылки из нескольких источников. И никакая > из ссылок не является её "именем". > > Так что если поставить вопрос правильно, то задача начинает иметь смысл. > Например: > - как найти все ссылки на переменную? > > Я постарался подобрать решение исходя из поставленной задачи (по какой из > ссылок переменную передали (скорее всего), если исходить из того, что она > была передана из хэша. > Поскольку мы обращались к хэшу прямо перед вызовом, это значит, что > padwalker увидит переменную на один стекфрейм выше. > > Да, ваше решение неплохо работает, хотя не очень лаконичное и требует внешнего модуля *use PadWalker ':all';* действительно "видит" только на один уровень и с такими случаями уже не справляется (не находит ничего) my %h = ( a => { b=> 1}, aa=> {bb=>2, ac=>2, ab=>{ bb=>2, ac=>2, }, } ); detect( $h{aa}{ab} ); ----------- следующая часть ----------- Вложение в формате HTML было извлечено… URL: From evdokimov.denis на gmail.com Fri Oct 4 06:54:53 2024 From: evdokimov.denis на gmail.com (Denis Evdokimov) Date: Fri, 4 Oct 2024 16:54:53 +0300 Subject: [Moscow.pm] =?utf-8?b?0KPQt9C90LDRgtGMINGA0L7QtNC40YLQtdC70Yw=?= =?utf-8?b?0YHQutC40Lkg0LrQu9GO0Ycg0L/QviDRgdGB0YvQu9C60LU=?= In-Reply-To: References: Message-ID: Я перепутал. Будет работать пт, 4 окт. 2024 г., 16:46 Alessandro Gorohovski via Moscow-pm < moscow-pm на pm.org>: > > > пт, 4 окт. 2024 г. в 16:20, Mons Anderson : > >> On Fri, Oct 4, 2024 at 3:50 PM Alessandro Gorohovski via Moscow-pm < >> moscow-pm на pm.org> wrote: >> >>> >>> >>> пт, 4 окт. 2024 г. в 13:35, Mons Anderson : >>> >>>> On Fri, Oct 4, 2024 at 1:21 PM Alessandro Gorohovski via Moscow-pm < >>>> moscow-pm на pm.org> wrote: >>>> >>>>> По всей видимости, Denis имел ввиду >>>>> say >>>>> но это не имеет отношение к функции >>>>> >>>>> А всё остально будет работать на старых тоже. >>>>> :) >>>>> >>>>> Конечно, "положа руку на сердце", предложенная функция -- это вариация >>>>> через for >>>>> первоначального алгоритма через while, который предложил ув. >>>>> Steffen Winkler >>>>> sub where_key { >>>>> my $ref = shift; >>>>> while ( my ($key, $value) = each %h ) { >>>>> >>>> >>>> откуда тут возьмётся %h? >>>> >>>> $ref eq $value >>>>> >>>> >>>> это неверное сравнение. >>>> переменные могут быть равны по строковому значению, но быть разными >>>> переменными. >>>> \$ref == \$value более правильное. >>>> >>> >>> Да, конечно первоначальный вариант с while >>> не совсем корректно отработает на таком случае >>> >>> my %h = ( a => { b=> 1}, aa=> {bb=>2, ac=>2, ab=>2, }, ); >>> >>> sub where_key { >>> my $hash = shift; >>> my $ref = shift; >>> while( my ($key, $value) = each %$hash ) { >>> $ref eq $value and return $key; >>> } >>> } >>> >>> say where_key( $h{aa}, $h{aa}{bb} ); >>> >>> может выдать не только ожидаемый bb , а любой из >>> ab >>> ac >>> bb >>> >>> Вот поэтому и предложил другой вариант с for >>> >>> sub where_key { >>> my $hash = shift; >>> my $v; >>> for( %$hash ) { >>> return $v if \$_[ 0 ] eq \$_; >>> $v = $_; >>> } >>> } >>> >>> >>> >>> >>>> >>>> >>>>> >>>>> and return $key; >>>>> } >>>>> return; >>>>> } >>>>> >>>> >>>> А вообще имхо вся эта затея полный бред. >>>> >>> >>> Кому как. >>> >>> >>> >>>> Значение не несёт в себе информации о том, кто и откуда на него >>>> ссылается. >>>> Поэтому только по значению такой поиск не может считаться корректным. >>>> Только с передачей хэша в котором ищем это имеет смысл. >>>> >>> >>> Вообще здесь вопрос звучит более широко: >>> >>> Как зная ссылку на переменную (scalar, array or hash) найти её название? >>> Perl интерпретатор как то же находит, справляется с этим. >>> >> >> Perl никак не справляется с этим. Значение не имеет имени. Оно имеет >= 1 >> ссылок на себя, каждая из которых равнозначно является её именем. Можно >> иметь на одну и ту же переменную ссылки из нескольких источников. И никакая >> из ссылок не является её "именем". >> >> Так что если поставить вопрос правильно, то задача начинает иметь смысл. >> Например: >> - как найти все ссылки на переменную? >> >> Я постарался подобрать решение исходя из поставленной задачи (по какой из >> ссылок переменную передали (скорее всего), если исходить из того, что она >> была передана из хэша. >> Поскольку мы обращались к хэшу прямо перед вызовом, это значит, что >> padwalker увидит переменную на один стекфрейм выше. >> >> > Да, ваше решение неплохо работает, > хотя не очень лаконичное и требует внешнего модуля > *use PadWalker ':all';* > > действительно "видит" только на один уровень > и с такими случаями уже не справляется (не находит ничего) > > my %h = ( a => { b=> 1}, aa=> {bb=>2, ac=>2, ab=>{ bb=>2, ac=>2, }, } ); > > detect( $h{aa}{ab} ); > > -- > Moscow.pm mailing list > moscow-pm на pm.org | http://moscow.pm.org > ----------- следующая часть ----------- Вложение в формате HTML было извлечено… URL: