[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