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 <[email protected]>:

> Это?
>
> #!/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 <[email protected]>:
>
>> Это?
>>
>> ср, 2 окт. 2024 г. в 09:22, Alessandro Gorohovski via Moscow-pm <
>> [email protected]>:
>>
>>> Жаль, что не совсем по subject,
>>> но спасибо за "пищу для размышлений".
>>>
>>>
>>> вт, 1 окт. 2024 г. в 23:15, Alexander Batyrshin <[email protected]>:
>>>
>>>> Когда-то давно я юзала https://metacpan.org/pod/Data%3A%3AFind для
>>>> поиска в сложных вложенных структурах.
>>>>
>>>>
>>>>
>>>> On 1 Oct 2024, at 12:34, Alessandro Gorohovski via Moscow-pm <
>>>> [email protected]> 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
>>>> [email protected] | http://moscow.pm.org
>>>>
>>>>
>>>> --
>>> Moscow.pm mailing list
>>> [email protected] | http://moscow.pm.org
>>>
>>
-- 
Moscow.pm mailing list
[email protected] | http://moscow.pm.org

Ответить