<div><div>Смотри, во-первых, в данном случае нет необходимости разыменовывать хэш и брать из него ссылку. Можено сразу передавать нужный хэш: $h{aa}.<br />Во-вторых, в функцию (в нижеприведенном коде вместо функции выступает переменная $val) мы уже передаем ссылку на хэш<br />{ bb => 2 }. Функция ничего не знает о ключе, он есть только в хэше.</div><div> </div><div>#!/usr/bin/perl -w</div><div>use strict;</div><div>use warnings;</div><div>use feature 'say';</div><div> </div><div>use DDP;</div><div>use Scalar::Util qw/refaddr/;</div><div> </div><div>my %h = ( a => { b => 1 }, aa => { bb => 2 } );</div><div>p %h;</div><div>say refaddr $h{aa};</div><div>my $val = $h{aa};</div><div>p $val;</div><div>say refaddr $val;</div><div>say refaddr $h{aa} == refaddr $val;</div><div> </div><div><div>Как вариант можно передавать предыдущее значение, где есть ключ.</div><div> </div><div>my %h = (aa => { bb => { cc => 3}});<br />where_key('bb', $h{aa});<br /><br />Либо передавать исходных хэш:</div><div><br />where_key($искомая_ссылка, \%h);</div></div></div><div> </div><div>----------------<div>01.10.2024, 14:44, "Alessandro Gorohovski" <an.gorohovski@gmail.com>:</div><div>Кому: Коваль Вячеслав (theathlet@yandex.ru);</div><div>Копия: Moscow.pm group (moscow-pm@pm.org);</div><div>Тема: [Moscow.pm] Узнать родительский ключ по ссылке;</div><div> </div><blockquote><div><div><div style="font-size:large">Вообще то передаётся ссылка (фактически адрес)</div><div style="font-size:large"> </div><div style="font-size:large"> \%{ $h{aa} } </div><div style="font-size:large"> </div><div style="font-size:large">, а не просто значение.</div></div> <div><div>вт, 1 окт. 2024 г. в 14:37, Коваль Вячеслав <<a href="mailto:theathlet@yandex.ru" rel="noopener noreferrer">theathlet@yandex.ru</a>>:</div><blockquote style="border-left-color:rgb( 204 , 204 , 204 );border-left-style:solid;border-left-width:1px;margin:0px 0px 0px 0.8ex;padding-left:1ex"><div>Для решения задачи все равно нужен доступ к исходному хэшу, т.к. в изначальном коде мы передаем уже обращаемся по ключу и в функцию уже передается значение, т.е. какой-то хэш или массив или значение. А чтобы получить ключ, то нужно рекурсивно пройтись по исходному хэшу и сравнить Scalar::Util::refaddr всех значений с исходным.</div><div> </div><div>----------------<div>01.10.2024, 13:47, "Alessandro Gorohovski via Moscow-pm" <<a href="mailto:moscow-pm@pm.org" rel="noopener noreferrer" target="_blank">moscow-pm@pm.org</a>>:</div><div>Кому: Moscow.pm group (<a href="mailto:moscow-pm@pm.org" rel="noopener noreferrer" target="_blank">moscow-pm@pm.org</a>);</div><div>Копия: Alessandro Gorohovski (<a href="mailto:an.gorohovski@gmail.com" rel="noopener noreferrer" target="_blank">an.gorohovski@gmail.com</a>);</div><div>Тема: [Moscow.pm] Узнать родительский ключ по ссылке;</div><div> </div><blockquote><div><div style="font-size:large">Нет, это не вариант.</div><div style="font-size:large">Функция не знает о хеше %h и его структуре, совсем не знает :)</div><div style="font-size:large"> </div><div style="font-size:large">Представьте, что этот хеш может быть не 2х уровневый, а много-много-вложенный по уровням</div><div style="font-size:large">и </div><div style="font-size:large"><span style="font-size:small">$ref eq $value</span> </div><div style="font-size:large">может случится на другом уровне.</div><div style="font-size:large"> </div></div> <div><div>вт, 1 окт. 2024 г. в 13:03, Steffen Winkler via Moscow-pm <<a href="mailto:moscow-pm@pm.org" rel="noopener noreferrer" target="_blank">moscow-pm@pm.org</a>>:</div><blockquote style="border-left-color:rgb( 204 , 204 , 204 );border-left-style:solid;border-left-width:1px;margin:0px 0px 0px 0.8ex;padding-left:1ex">use strict;<br />use warnings;<br /><br />my %h = ( a => { b=> 1}, aa=> {bb=>2, }, );<br /><br />sub where_key {<!-- --><br />     my $ref = shift;<br /><br />     while ( my ($key, $value) = each %h ) {<!-- --><br />         $ref eq $value<br />              and return $key;<br />     }<br /><br />     return;<br />}<br /><br />my $k = where_key( $h{aa} );<br />print $k;<br />exit;<br /><br /><br />--<br />Moscow.pm mailing list<br /><a href="mailto:moscow-pm@pm.org" rel="noopener noreferrer" target="_blank">moscow-pm@pm.org</a> | <a href="http://moscow.pm.org/" rel="noopener noreferrer" target="_blank">http://moscow.pm.org</a></blockquote></div>,--<br />Moscow.pm mailing list<br /><a href="mailto:moscow-pm@pm.org" rel="noopener noreferrer" target="_blank">moscow-pm@pm.org</a> | <a href="http://moscow.pm.org/" rel="noopener noreferrer" target="_blank">http://moscow.pm.org</a></blockquote><div> </div><div> </div><div> </div><div> </div></div><div>-- <br />Яндекс.Почта — надёжная почта</div><div><a href="http://mail.yandex.ru/neo2/collect/?exp=1&t=1" rel="noopener noreferrer" target="_blank">http://mail.yandex.ru/neo2/collect/?exp=1&t=1</a></div></blockquote></div></div></blockquote><div> </div><div> </div><div> </div><div> </div></div><div>-- <br />Яндекс.Почта — надёжная почта</div><div>http://mail.yandex.ru/neo2/collect/?exp=1&t=1</div>