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

Denis Evdokimov evdokimov.denis на gmail.com
Пт Окт 4 02:23:24 PDT 2024


Это будет работать только на новых версиях.
Если это допустимо, то так, конечно проще и понятнее

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


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