<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>