<div dir="ltr"><div dir="ltr"><div class="gmail_default" style="font-size:large">Hello Steffen,</div></div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">вт, 1 окт. 2024 г. в 18:17, Steffen Winkler via Moscow-pm <<a href="mailto:moscow-pm@pm.org">moscow-pm@pm.org</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"><u></u>
<div>
<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></p></div></blockquote><div><font size="4">It turns out that you know in advance what </font>stringified<span style="font-size:large"> references to expect</span><span class="gmail_default" style="font-size:large"></span></div><div><font size="4"><span class="gmail_default" style="">?</span></font></div><div><font size="4">Or you need to know the full structure of the hash you are investigating in order to create a lot of nested loops over nested arrays and hashes and scalars.<span class="gmail_default" style=""><br></span></font></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><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div><p>
Steffen<br>
<br>
auto translated<br>
Здравствуйте,<br>
В цикле while я проверяю строковую ссылку на эту хэш-ссылку. Если
она равна, то это одна и та же хэш-ссылка и я возвращаю вывод.
Если равных хэш-ссылок больше одной, то нужно поместить ключи в
массив и не возвращать.<br>
Штеффен<br>
</p>
<div>Am 01.10.2024 um 14:03 schrieb Коваль
Вячеслав via Moscow-pm:<br>
</div>
<blockquote type="cite">
<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 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>
<br>
<fieldset></fieldset>
</blockquote>
</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></div>