<div dir="ltr"><div>Но если это с целью исследования, а не для прода, то можно поиграться с internals</div><div><br></div><div><div style="color:rgb(204,204,204);background-color:rgb(31,31,31);font-family:Menlo,Monaco,"Courier New",monospace;font-size:12px;line-height:18px;white-space:pre"><div><span style="color:rgb(197,134,192)">use</span> 5.016;</div><div><span style="color:rgb(197,134,192)">use</span> DDP;</div><div><span style="color:rgb(197,134,192)">use</span> Devel::Peek;</div><div><span style="color:rgb(197,134,192)">use</span> PadWalker <span style="color:rgb(206,145,120)">':all'</span>;</div><br><div><span style="color:rgb(86,156,214)">my</span> <span style="color:rgb(156,220,254)">%h_my</span> = (a <span style="color:rgb(212,212,212)">=></span> 1, b <span style="color:rgb(212,212,212)">=></span> 1);</div><div><span style="color:rgb(86,156,214)">our</span> <span style="color:rgb(156,220,254)">%h_our</span> = (a <span style="color:rgb(212,212,212)">=></span> 1, b <span style="color:rgb(212,212,212)">=></span> 1);</div><div><span style="color:rgb(86,156,214)">my</span> <span style="color:rgb(156,220,254)">$r_my</span> = {a <span style="color:rgb(212,212,212)">=></span> 1, b <span style="color:rgb(212,212,212)">=></span> 1};</div><div><span style="color:rgb(86,156,214)">our</span> <span style="color:rgb(156,220,254)">$r_our</span> = {a <span style="color:rgb(212,212,212)">=></span> 1, b <span style="color:rgb(212,212,212)">=></span> 1};</div><br><div>detect(<span style="color:rgb(156,220,254)">$h_my</span>{a});</div><div>detect(<span style="color:rgb(156,220,254)">$h_our</span>{b});</div><div>detect(<span style="color:rgb(156,220,254)">$r_my</span><span style="color:rgb(212,212,212)">-></span>{a});</div><div>detect(<span style="color:rgb(156,220,254)">$r_our</span><span style="color:rgb(212,212,212)">-></span>{b});</div><br><div><span style="color:rgb(86,156,214)">sub</span> <span style="color:rgb(220,220,170)">detect</span> {</div><div>    <span style="color:rgb(86,156,214)">my</span> <span style="color:rgb(156,220,254)">$what</span> = \<span style="color:rgb(220,220,170)">shift</span>;</div><div>    <span style="color:rgb(220,220,170)">say</span> <span style="color:rgb(206,145,120)">"searching for </span><span style="color:rgb(156,220,254)">$what</span><span style="color:rgb(206,145,120)">: [</span><span style="color:rgb(156,220,254)">$$what</span><span style="color:rgb(206,145,120)">]"</span>;</div><div>    <span style="color:rgb(106,153,85)"># Dump($$what);</span></div><div>    <span style="color:rgb(197,134,192)">for</span> <span style="color:rgb(86,156,214)">my</span> <span style="color:rgb(156,220,254)">$vars</span> (</div><div>        peek_my(1),</div><div>        peek_our(1),</div><div>    ) {</div><div>        <span style="color:rgb(197,134,192)">while</span> (<span style="color:rgb(86,156,214)">my</span> (<span style="color:rgb(156,220,254)">$name</span>, <span style="color:rgb(156,220,254)">$ref</span>) = <span style="color:rgb(220,220,170)">each</span> <span style="color:rgb(156,220,254)">%$vars</span>){</div><div>            <span style="color:rgb(156,220,254)">$ref</span> = <span style="color:rgb(156,220,254)">$$ref</span> <span style="color:rgb(197,134,192)">if</span> <span style="color:rgb(220,220,170)">ref</span> <span style="color:rgb(156,220,254)">$ref</span> <span style="color:rgb(220,220,170)">eq</span> <span style="color:rgb(206,145,120)">'REF'</span>;</div><div>            <span style="color:rgb(197,134,192)">if</span> (<span style="color:rgb(220,220,170)">ref</span> <span style="color:rgb(156,220,254)">$ref</span> <span style="color:rgb(220,220,170)">eq</span> <span style="color:rgb(206,145,120)">'HASH'</span>) {</div><div>                <span style="color:rgb(197,134,192)">while</span> (<span style="color:rgb(86,156,214)">my</span> (<span style="color:rgb(156,220,254)">$key</span>, <span style="color:rgb(156,220,254)">$val</span>) = <span style="color:rgb(220,220,170)">each</span> <span style="color:rgb(156,220,254)">%$ref</span>){</div><div>                    <span style="color:rgb(106,153,85)"># say "$name -> $key :";</span></div><div>                    <span style="color:rgb(106,153,85)"># Dump($val);</span></div><div>                    <span style="color:rgb(197,134,192)">if</span> (\<span style="color:rgb(156,220,254)">$ref</span><span style="color:rgb(212,212,212)">-></span>{<span style="color:rgb(156,220,254)">$key</span>} == <span style="color:rgb(156,220,254)">$what</span>) {</div><div>                        <span style="color:rgb(220,220,170)">say</span> <span style="color:rgb(206,145,120)">"found ref </span><span style="color:rgb(156,220,254)">$what</span><span style="color:rgb(206,145,120)"> in </span><span style="color:rgb(156,220,254)">$name</span><span style="color:rgb(206,145,120)"> as </span><span style="color:rgb(156,220,254)">$key</span><span style="color:rgb(206,145,120)">"</span>;</div><div>                        <span style="color:rgb(197,134,192)">return</span>;</div><div>                    }</div><div>                }</div><div>            }</div><div>        }</div><div>    }</div><div>}</div></div></div><div dir="ltr"><br></div><div dir="ltr"><br clear="all"><div><div dir="ltr" class="gmail_signature"><div dir="ltr">Best wishes,<div>Mons</div></div></div></div><br></div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Fri, Oct 4, 2024 at 1:35 PM Mons Anderson <<a href="mailto:mons@cpan.org">mons@cpan.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">On Fri, Oct 4, 2024 at 1:21 PM Alessandro Gorohovski via Moscow-pm <<a href="mailto:moscow-pm@pm.org" target="_blank">moscow-pm@pm.org</a>> wrote:<br></div><div class="gmail_quote"><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 style="font-size:large">По всей видимости, Denis имел ввиду</div><div style="font-size:large">say</div><div style="font-size:large">но это не имеет отношение к функции</div><div style="font-size:large"><br></div><div style="font-size:large">А всё остально будет работать на старых тоже.</div><div style="font-size:large">:)</div><div style="font-size:large"><br></div><div style="font-size:large">Конечно, "положа руку на сердце", предложенная функция -- это вариация через for</div><div style="font-size:large">первоначального алгоритма через while, который предложил ув.</div><div style="margin:0px;min-width:0px;padding:0px 0px 20px;width:initial;font-family:"Google Sans",Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:medium"><div style="font-size:0.875rem;padding:20px 0px 0px"><table cellpadding="0" style="border-collapse:collapse;margin-top:0px;width:auto;font-size:0.875rem;display:block"><tbody style="display:block"><tr style="height:auto;display:flex"><td style="padding:0px;vertical-align:top;width:813.688px;line-height:20px;display:block;max-height:20px"><table cellpadding="0" style="border-collapse:collapse;table-layout:fixed;width:813.688px"><tbody><tr><td style="display:flex"><h3 style="overflow:hidden;font-size:0.75rem;font-weight:inherit;margin:inherit;text-overflow:ellipsis;color:rgb(95,99,104);line-height:20px"><span role="gridcell"><span name="Steffen Winkler via Moscow-pm" style="color:rgb(31,31,31);font-size:0.875rem;font-weight:bold;display:inline;vertical-align:top;line-height:20px"><span style="vertical-align:top">Steffen Winkler</span></span></span></h3></td></tr></tbody></table></td></tr></tbody></table></div></div><div style="font-size:large"><span style="font-size:small">sub where_key {</span><br style="font-size:small"><span style="font-size:small">     my $ref = shift;</span><br style="font-size:small"><span style="font-size:small">     while ( my ($key, $value) = each %h ) {</span></div></div></blockquote><div><br></div><div>откуда тут возьмётся  %h?</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 dir="ltr"><div style="font-size:large"><span style="font-size:small">         $ref eq $value</span></div></div></blockquote><div><br></div><div>это неверное сравнение.</div><div>переменные могут быть равны по строковому значению, но быть разными переменными.</div><div>\$ref == \$value более правильное.</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 dir="ltr"><div style="font-size:large"><br style="font-size:small"><span style="font-size:small">              and return $key;</span><br style="font-size:small"><span style="font-size:small">     }</span><br style="font-size:small"><span style="font-size:small">     return;</span><br style="font-size:small"><span style="font-size:small">}</span></div></div></blockquote><div><br></div><div>А вообще имхо вся эта затея полный бред.</div><div>Значение не несёт в себе информации о том, кто и откуда на него ссылается.</div><div>Поэтому только по значению такой поиск не может считаться корректным.</div><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 dir="ltr"><div style="font-size:large"></div><div style="font-size:large">Только с неявно заданным для функции хэшем.</div></div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">пт, 4 окт. 2024 г. в 13:06, Dmitry L. via Moscow-pm <<a href="mailto:moscow-pm@pm.org" target="_blank">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">Почему только на новых? (и на сколько новых?).<br>
<br>
On Fri, 4 Oct 2024 at 12:23, Denis Evdokimov via Moscow-pm<br>
<<a href="mailto:moscow-pm@pm.org" target="_blank">moscow-pm@pm.org</a>> wrote:<br>
><br>
> Это будет работать только на новых версиях.<br>
> Если это допустимо, то так, конечно проще и понятнее<br>
><br>
><br>
> пт, 4 окт. 2024 г., 10:02 Alessandro Gorohovski <<a href="mailto:an.gorohovski@gmail.com" target="_blank">an.gorohovski@gmail.com</a>>:<br>
>><br>
>> Denis, приветствую!<br>
>><br>
>> Извиняюсь за то, что отвечаю с опозданием.<br>
>> Был вовне.<br>
>><br>
>> Действительно Ваш код хорош при определённых условиях,<br>
>> например, если передавать просто ссылку на хеш родителя<br>
>> и использовать это как ядро рекурсии.<br>
>> Премного благодарен.<br>
>><br>
>> Только я ему сделал небольшую оптимизацию: убрал лишний внутренний цикл.<br>
>> Так пожалуй прозрачнее и быстрее будет работать.<br>
>> Вот что получилось:<br>
>><br>
>> my %h = ( a => 1, b => 1, c => 1 );<br>
>> say "a";<br>
>> say findHashKey( \%h, $h{ a } );<br>
>> say "";<br>
>> say "b";<br>
>> say findHashKey( \%h, $h{ b } );<br>
>> say "";<br>
>> say "c";<br>
>> say findHashKey( \%h, $h{ c } );<br>
>><br>
>> sub findHashKey {<br>
>>  my $hash  = shift;<br>
>><br>
>>  my $v;<br>
>>  for( %$hash ) {<br>
>>     return $v if \$_[ 0 ] eq \$_;<br>
>>     $v = $_;<br>
>>   }<br>
>> }<br>
>><br>
>> OUTPUT:<br>
>> a<br>
>> a<br>
>><br>
>> b<br>
>> b<br>
>><br>
>> c<br>
>> c<br>
>><br>
>><br>
>> ср, 2 окт. 2024 г. в 14:18, Denis Evdokimov <<a href="mailto:evdokimov.denis@gmail.com" target="_blank">evdokimov.denis@gmail.com</a>>:<br>
>>><br>
>>> Это?<br>
>>><br>
>>> #!/usr/bin/perl<br>
>>> use 5.10.0;<br>
>>> use strict;<br>
>>> use warnings;<br>
>>> use utf8;<br>
>>> use open qw(:std :utf8);<br>
>>><br>
>>> my %h = ( a => 1, b => 1, c => 1 );<br>
>>><br>
>>> say "a";<br>
>>> say findHashKey( \%h, $h{ a } );<br>
>>> say "";<br>
>>> say "b";<br>
>>> say findHashKey( \%h, $h{ b } );<br>
>>> say "";<br>
>>> say "c";<br>
>>> say findHashKey( \%h, $h{ c } );<br>
>>><br>
>>> ################################################################################<br>
>>> sub findHashKey {<br>
>>>     my $hash     = shift;<br>
>>>     my $valueRef = \$_[ 0 ];<br>
>>><br>
>>>     my $key;<br>
>>>     my $i = 0;<br>
>>>     foreach ( values %$hash ) {<br>
>>>         if ( $valueRef eq \$_ ) {<br>
>>>             foreach ( keys %$hash ) {<br>
>>>                 $i-- == 0 or next;<br>
>>>                 $key = $_;<br>
>>>                 last;<br>
>>>             }<br>
>>>             last;<br>
>>>         }<br>
>>>         else {<br>
>>>             ++$i;<br>
>>>         }<br>
>>>     }<br>
>>>     return $key;<br>
>>> }<br>
>>> ################################################################################<br>
>>><br>
>>> ср, 2 окт. 2024 г. в 14:17, Denis Evdokimov <<a href="mailto:evdokimov.denis@gmail.com" target="_blank">evdokimov.denis@gmail.com</a>>:<br>
>>>><br>
>>>> Это?<br>
>>>><br>
>>>> ср, 2 окт. 2024 г. в 09:22, Alessandro Gorohovski via Moscow-pm <<a href="mailto:moscow-pm@pm.org" target="_blank">moscow-pm@pm.org</a>>:<br>
>>>>><br>
>>>>> Жаль, что не совсем по subject,<br>
>>>>> но спасибо за "пищу для размышлений".<br>
>>>>><br>
>>>>><br>
>>>>> вт, 1 окт. 2024 г. в 23:15, Alexander Batyrshin <<a href="mailto:0x62ash@gmail.com" target="_blank">0x62ash@gmail.com</a>>:<br>
>>>>>><br>
>>>>>> Когда-то давно я юзала <a href="https://metacpan.org/pod/Data%3A%3AFind" rel="noreferrer" target="_blank">https://metacpan.org/pod/Data%3A%3AFind</a> для поиска в сложных вложенных структурах.<br>
>>>>>><br>
>>>>>><br>
>>>>>><br>
>>>>>> On 1 Oct 2024, at 12:34, Alessandro Gorohovski via Moscow-pm <<a href="mailto:moscow-pm@pm.org" target="_blank">moscow-pm@pm.org</a>> wrote:<br>
>>>>>><br>
>>>>>> Уважаемое сообщество, приветствую!<br>
>>>>>><br>
>>>>>> Подскажите, может кто-нибудб знает/сталкивался:<br>
>>>>>> существует ли способ узнать родительский ключ хеша по ссылке?<br>
>>>>>><br>
>>>>>> # Например, есть хеш<br>
>>>>>> my %h = ( a => { b=> 1}, aa=> {bb=>2, }, );<br>
>>>>>><br>
>>>>>> # вызов функции, где необходимо узнать родительский ключ<br>
>>>>>> # например, 'aa'<br>
>>>>>> my $k = &where_key( \%{ $h{aa} } );<br>
>>>>>><br>
>>>>>> exit;<br>
>>>>>><br>
>>>>>> sub where_key {<br>
>>>>>>   my $sh = shift;<br>
>>>>>><br>
>>>>>>   my $k =  ??? if ref( $sh ) eq 'HASH';<br>
>>>>>><br>
>>>>>>   return $k;<br>
>>>>>> }<br>
>>>>>> --<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>
>>>>>><br>
>>>>>><br>
>>>>> --<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>
><br>
> --<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>
<br>
<br>
<br>
-- <br>
//wbr, Dmitry L.<br>
-- <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>
-- <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>
</blockquote></div></div>