[Moscow.pm] Узнать родительский ключ по ссылке
Alessandro Gorohovski
an.gorohovski на gmail.com
Пт Окт 4 05:49:39 PDT 2024
пт, 4 окт. 2024 г. в 13:35, Mons Anderson <mons на cpan.org>:
> 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 более правильное.
>
Да, конечно первоначальный вариант с while
не совсем корректно отработает на таком случае
my %h = ( a => { b=> 1}, aa=> {bb=>2, ac=>2, ab=>2, }, );
sub where_key {
my $hash = shift;
my $ref = shift;
while( my ($key, $value) = each %$hash ) {
$ref eq $value and return $key;
}
}
say where_key( $h{aa}, $h{aa}{bb} );
может выдать не только ожидаемый bb , а любой из
ab
ac
bb
Вот поэтому и предложил другой вариант с for
sub where_key {
my $hash = shift;
my $v;
for( %$hash ) {
return $v if \$_[ 0 ] eq \$_;
$v = $_;
}
}
>
>
>>
>> and return $key;
>> }
>> return;
>> }
>>
>
> А вообще имхо вся эта затея полный бред.
>
Кому как.
> Значение не несёт в себе информации о том, кто и откуда на него ссылается.
> Поэтому только по значению такой поиск не может считаться корректным.
> Только с передачей хэша в котором ищем это имеет смысл.
>
Вообще здесь вопрос звучит более широко:
Как зная ссылку на переменную (scalar, array or hash) найти её название?
Perl интерпретатор как то же находит, справляется с этим.
>
>
>> Только с неявно заданным для функции хэшем.
>>
>> пт, 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/59217ce0/attachment-0001.html>
Подробная информация о списке рассылки Moscow-pm