[Moscow.pm] Узнать родительский ключ по ссылке

Alessandro Gorohovski an.gorohovski на gmail.com
Пт Окт 4 00:02:10 PDT 2024


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
>>>
>>
----------- следующая часть -----------
Вложение в формате HTML было извлечено…
URL: <http://mail.pm.org/pipermail/moscow-pm/attachments/20241004/c7930bb7/attachment.html>


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