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

Dmitry L. dim0xff на gmail.com
Пт Окт 4 03:05:49 PDT 2024


Почему только на новых? (и на сколько новых?).

On Fri, 4 Oct 2024 at 12:23, Denis Evdokimov via Moscow-pm
<moscow-pm на pm.org> 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