[Moscow.pm] Узнать родительский ключ по ссылке
Mons Anderson
mons на cpan.org
Пт Окт 4 05:35:04 PDT 2024
Но если это с целью исследования, а не для прода, то можно поиграться с
internals
use 5.016;
use DDP;
use Devel::Peek;
use PadWalker ':all';
my %h_my = (a => 1, b => 1);
our %h_our = (a => 1, b => 1);
my $r_my = {a => 1, b => 1};
our $r_our = {a => 1, b => 1};
detect($h_my{a});
detect($h_our{b});
detect($r_my->{a});
detect($r_our->{b});
sub detect {
my $what = \shift;
say "searching for $what: [$$what]";
# Dump($$what);
for my $vars (
peek_my(1),
peek_our(1),
) {
while (my ($name, $ref) = each %$vars){
$ref = $$ref if ref $ref eq 'REF';
if (ref $ref eq 'HASH') {
while (my ($key, $val) = each %$ref){
# say "$name -> $key :";
# Dump($val);
if (\$ref->{$key} == $what) {
say "found ref $what in $name as $key";
return;
}
}
}
}
}
}
Best wishes,
Mons
On Fri, Oct 4, 2024 at 1:35 PM Mons Anderson <mons на cpan.org> wrote:
> 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/ca1cb531/attachment-0001.html>
Подробная информация о списке рассылки Moscow-pm