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

Alessandro Gorohovski an.gorohovski на gmail.com
Пт Окт 4 03:21:26 PDT 2024


По всей видимости, Denis имел ввиду
say
но это не имеет отношение к функции

А всё остально будет работать на старых тоже.
:)

Конечно, "положа руку на сердце", предложенная функция -- это вариация
через for
первоначального алгоритма через while, который предложил ув.
Steffen Winkler
sub where_key {
     my $ref = shift;
     while ( my ($key, $value) = each %h ) {
         $ref eq $value
              and return $key;
     }
     return;
}

Только с неявно заданным для функции хэшем.

пт, 4 окт. 2024 г. в 13:06, Dmitry L. via Moscow-pm <moscow-pm на pm.org>:

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


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