[Moscow.pm] Узнать родительский ключ по ссылке
Mons Anderson
mons на cpan.org
Пт Окт 4 03:35:33 PDT 2024
On Fri, Oct 4, 2024 at 1:21 PM Alessandro Gorohovski via Moscow-pm <
moscow-pm на pm.org> wrote:
> По всей видимости, Denis имел ввиду
> say
> но это не имеет отношение к функции
>
> А всё остально будет работать на старых тоже.
> :)
>
> Конечно, "положа руку на сердце", предложенная функция -- это вариация
> через for
> первоначального алгоритма через while, который предложил ув.
> Steffen Winkler
> sub where_key {
> my $ref = shift;
> while ( my ($key, $value) = each %h ) {
>
откуда тут возьмётся %h?
$ref eq $value
>
это неверное сравнение.
переменные могут быть равны по строковому значению, но быть разными
переменными.
\$ref == \$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
>>
> --
> Moscow.pm mailing list
> moscow-pm на pm.org | http://moscow.pm.org
>
----------- следующая часть -----------
Вложение в формате HTML было извлечено…
URL: <http://mail.pm.org/pipermail/moscow-pm/attachments/20241004/4284e708/attachment-0001.html>
Подробная информация о списке рассылки Moscow-pm