[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