<div dir="ltr"><div><br></div><div>Если по значению нужно найти ключ, то придется рекурсивно обойти весь хеш и сверить. При этом ключей может быть больше одного.</div><div>Но вопрос в другом: зачем это нужно? Почему бы просто не передать и ключ и значение туда, где это нужно? Или создать таблицу для обратного поиска. </div><br clear="all"><div><div dir="ltr" class="gmail_signature" data-smartmail="gmail_signature"><div dir="ltr"><div><div>Met vriendelijke groet,</div></div><div></div>Alex</div></div></div><br></div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Tue, Oct 1, 2024 at 7:24 PM Alessandro Gorohovski via Moscow-pm <<a href="mailto:moscow-pm@pm.org">moscow-pm@pm.org</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div dir="ltr"><div dir="ltr"><div class="gmail_default" style="font-size:large"><br></div></div><div class="gmail_quote"><div dir="ltr" class="gmail_attr">вт, 1 окт. 2024 г. в 15:03, Коваль Вячеслав <<a href="mailto:theathlet@yandex.ru" target="_blank">theathlet@yandex.ru</a>>:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div><div>Смотри, во-первых, в данном случае нет необходимости разыменовывать хэш и брать из него ссылку. Можено сразу передавать нужный хэш: $h{aa}.<br></div></div></blockquote><div><br></div><div><div class="gmail_default" style="font-size:large">Да, согласен, конечно можно и нужно так. Спасибо.</div><div class="gmail_default" style="font-size:large">Просто хотел этой конструкцией дополнительно выделить цель и обратить на неё внимание.</div></div><div> </div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div><div>Во-вторых, в функцию (в нижеприведенном коде вместо функции выступает переменная $val) мы уже передаем ссылку на хэш<br>{ bb => 2 }. Функция ничего не знает о ключе, он есть только в хэше.</div><div> </div></div></blockquote><div><br></div><div><div class="gmail_default" style="font-size:large">Понимаете, здесь проблема не в том, чтобы узнать какие ключи-потомки есть в передаваемой ссылке,</div><div class="gmail_default" style="font-size:large">а узнать именно родительский ключ '<b>aa</b>'.</div></div><div> </div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><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></blockquote><div><br></div><div><div class="gmail_default" style="font-size:large">К сожалению это всё предполагает, что вы <u>наперед знаете о том, что родительский ключ 'аа'</u></div><div class="gmail_default" style="font-size:large">и ожидаете когда ссылка на него появится.</div><div class="gmail_default" style="font-size:large">А если неизвестно заранее как называется родительский ключ?</div><div class="gmail_default" style="font-size:large">Известно только, что такой ключ единственный.</div><br></div><div> </div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><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></div></blockquote><div> </div><div><div class="gmail_default" style="font-size:large">Здесь, честно говоря, не понятно как эта функция вернёт ключ 'aa' ?</div><br></div><div> </div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div><div><div>Либо передавать исходных хэш:</div><div><br>where_key($искомая_ссылка, \%h);</div></div></div></blockquote><div><br></div><div><div class="gmail_default" style="font-size:large">Теоретически возможно, хотя чрезвычайно сложно и</div><div class="gmail_default" style="font-size:large">здесь придётся искать совпадения адресов с передаваемым ссылкой</div><div class="gmail_default" style="font-size:large">по всему хешу с неизвестной структурой.</div><div class="gmail_default" style="font-size:large"><br></div><div class="gmail_default" style="font-size:large">Я предполагал, что можно получить доступ к некой "глобальной" таблице с описанием связей </div><div class="gmail_default" style="font-size:large">'ключ' => 'адрес' или наоборот.</div><div class="gmail_default" style="font-size:large">А зная адрес найти нужный 'ключ'.</div></div><div><br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div> </div><div>----------------<div>01.10.2024, 14:44, "Alessandro Gorohovski" <<a href="mailto:an.gorohovski@gmail.com" target="_blank">an.gorohovski@gmail.com</a>>:</div><div>Кому: Коваль Вячеслав (<a href="mailto:theathlet@yandex.ru" target="_blank">theathlet@yandex.ru</a>);</div><div>Копия: Moscow.pm group (<a href="mailto:moscow-pm@pm.org" target="_blank">moscow-pm@pm.org</a>);</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" target="_blank">theathlet@yandex.ru</a>>:</div><blockquote style="border-left:1px solid rgb(204,204,204);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:1px solid rgb(204,204,204);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><a href="http://mail.yandex.ru/neo2/collect/?exp=1&t=1" target="_blank">http://mail.yandex.ru/neo2/collect/?exp=1&t=1</a></div></blockquote></div></div>
-- <br>
Moscow.pm mailing list<br>
<a href="mailto:moscow-pm@pm.org" target="_blank">moscow-pm@pm.org</a> | <a href="http://moscow.pm.org" rel="noreferrer" target="_blank">http://moscow.pm.org</a><br>
</blockquote></div>