Для решения задачи все равно нужен доступ к исходному хэшу, т.к. в изначальном коде мы передаем уже обращаемся по ключу и в функцию уже передается значение, т.е. какой-то хэш или массив или значение. А чтобы получить ключ, то нужно рекурсивно пройтись по исходному хэшу и сравнить Scalar::Util::refaddr всех значений с исходным.
 
----------------
01.10.2024, 13:47, "Alessandro Gorohovski via Moscow-pm" <[email protected]>:
Кому: Moscow.pm group ([email protected]);
Копия: Alessandro Gorohovski ([email protected]);
Тема: [Moscow.pm] Узнать родительский ключ по ссылке;
 
Нет, это не вариант.
Функция не знает о хеше %h и его структуре, совсем не знает :)
 
Представьте, что этот хеш может быть не 2х уровневый, а много-много-вложенный по уровням
и 
$ref eq $value 
может случится на другом уровне.
 
 
вт, 1 окт. 2024 г. в 13:03, Steffen Winkler via Moscow-pm <[email protected]>:
use strict;
use warnings;

my %h = ( a => { b=> 1}, aa=> {bb=>2, }, );

sub where_key {
     my $ref = shift;

     while ( my ($key, $value) = each %h ) {
         $ref eq $value
              and return $key;
     }

     return;
}

my $k = where_key( $h{aa} );
print $k;
exit;


--
Moscow.pm mailing list
[email protected] | http://moscow.pm.org
,--
Moscow.pm mailing list
[email protected] | http://moscow.pm.org
 
 
 
 
-- 
Яндекс.Почта — надёжная почта
http://mail.yandex.ru/neo2/collect/?exp=1&t=1
-- 
Moscow.pm mailing list
[email protected] | http://moscow.pm.org

Ответить