On Fri, Oct 4, 2024 at 3:50 PM Alessandro Gorohovski via Moscow-pm < [email protected]> wrote:
> > > пт, 4 окт. 2024 г. в 13:35, Mons Anderson <[email protected]>: > >> On Fri, Oct 4, 2024 at 1:21 PM Alessandro Gorohovski via Moscow-pm < >> [email protected]> wrote: >> >>> По всей видимости, Denis имел ввиду >>> say >>> но это не имеет отношение к функции >>> >>> А всё остально будет работать на старых тоже. >>> :) >>> >>> Конечно, "положа руку на сердце", предложенная функция -- это вариация >>> через for >>> первоначального алгоритма через while, который предложил ув. >>> Steffen Winkler >>> sub where_key { >>> my $ref = shift; >>> while ( my ($key, $value) = each %h ) { >>> >> >> откуда тут возьмётся %h? >> >> $ref eq $value >>> >> >> это неверное сравнение. >> переменные могут быть равны по строковому значению, но быть разными >> переменными. >> \$ref == \$value более правильное. >> > > Да, конечно первоначальный вариант с while > не совсем корректно отработает на таком случае > > my %h = ( a => { b=> 1}, aa=> {bb=>2, ac=>2, ab=>2, }, ); > > sub where_key { > my $hash = shift; > my $ref = shift; > while( my ($key, $value) = each %$hash ) { > $ref eq $value and return $key; > } > } > > say where_key( $h{aa}, $h{aa}{bb} ); > > может выдать не только ожидаемый bb , а любой из > ab > ac > bb > > Вот поэтому и предложил другой вариант с for > > sub where_key { > my $hash = shift; > my $v; > for( %$hash ) { > return $v if \$_[ 0 ] eq \$_; > $v = $_; > } > } > > > > >> >> >>> >>> and return $key; >>> } >>> return; >>> } >>> >> >> А вообще имхо вся эта затея полный бред. >> > > Кому как. > > > >> Значение не несёт в себе информации о том, кто и откуда на него ссылается. >> Поэтому только по значению такой поиск не может считаться корректным. >> Только с передачей хэша в котором ищем это имеет смысл. >> > > Вообще здесь вопрос звучит более широко: > > Как зная ссылку на переменную (scalar, array or hash) найти её название? > Perl интерпретатор как то же находит, справляется с этим. > Perl никак не справляется с этим. Значение не имеет имени. Оно имеет >= 1 ссылок на себя, каждая из которых равнозначно является её именем. Можно иметь на одну и ту же переменную ссылки из нескольких источников. И никакая из ссылок не является её "именем". Так что если поставить вопрос правильно, то задача начинает иметь смысл. Например: - как найти все ссылки на переменную? Я постарался подобрать решение исходя из поставленной задачи (по какой из ссылок переменную передали (скорее всего), если исходить из того, что она была передана из хэша. Поскольку мы обращались к хэшу прямо перед вызовом, это значит, что padwalker увидит переменную на один стекфрейм выше. >
-- Moscow.pm mailing list [email protected] | http://moscow.pm.org
