<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
</head>
<body>
<p>Hello,<br>
What I have done in the while loop, I check the stringified
reference of that hash reference. If that is equal, the the same
hash reference is there and I return the output. If there are more
then one equal hash references you have to put the keys into an
array and do not return.<br>
Steffen<br>
<br>
auto translated<br>
Здравствуйте,<br>
В цикле while я проверяю строковую ссылку на эту хэш-ссылку. Если
она равна, то это одна и та же хэш-ссылка и я возвращаю вывод.
Если равных хэш-ссылок больше одной, то нужно поместить ключи в
массив и не возвращать.<br>
Штеффен<br>
</p>
<div class="moz-cite-prefix">Am 01.10.2024 um 14:03 schrieb Коваль
Вячеслав via Moscow-pm:<br>
</div>
<blockquote type="cite" cite="mid:158341727783484@mail.yandex.ru">
<meta http-equiv="content-type" content="text/html; charset=UTF-8">
<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"
<a class="moz-txt-link-rfc2396E" href="mailto:an.gorohovski@gmail.com"><an.gorohovski@gmail.com></a>:</div>
<div>Кому: Коваль Вячеслав (<a class="moz-txt-link-abbreviated" href="mailto:theathlet@yandex.ru">theathlet@yandex.ru</a>);</div>
<div>Копия: Moscow.pm group (<a class="moz-txt-link-abbreviated" href="mailto:moscow-pm@pm.org">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" moz-do-not-send="true"
class="moz-txt-link-freetext">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"
moz-do-not-send="true"
class="moz-txt-link-freetext">moscow-pm@pm.org</a>>:</div>
<div>Кому: Moscow.pm group (<a
href="mailto:moscow-pm@pm.org"
rel="noopener noreferrer" target="_blank"
moz-do-not-send="true"
class="moz-txt-link-freetext">moscow-pm@pm.org</a>);</div>
<div>Копия: Alessandro Gorohovski (<a
href="mailto:an.gorohovski@gmail.com"
rel="noopener noreferrer" target="_blank"
moz-do-not-send="true"
class="moz-txt-link-freetext">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"
moz-do-not-send="true"
class="moz-txt-link-freetext">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"
moz-do-not-send="true"
class="moz-txt-link-freetext">moscow-pm@pm.org</a>
| <a href="http://moscow.pm.org/"
rel="noopener noreferrer" target="_blank"
moz-do-not-send="true"
class="moz-txt-link-freetext">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"
moz-do-not-send="true"
class="moz-txt-link-freetext">moscow-pm@pm.org</a>
| <a href="http://moscow.pm.org/"
rel="noopener noreferrer" target="_blank"
moz-do-not-send="true"
class="moz-txt-link-freetext">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"
moz-do-not-send="true">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 class="moz-txt-link-freetext" href="http://mail.yandex.ru/neo2/collect/?exp=1&t=1">http://mail.yandex.ru/neo2/collect/?exp=1&t=1</a></div>
<br>
<fieldset class="moz-mime-attachment-header"></fieldset>
</blockquote>
</body>
</html>