LINUX.ORG.RU

сложный вопрос по perl


0

0

этот код делает следующее. Есть файл со строками, в каждой из строк 
через три разделителя идут числа(которые могут быть одинаковыми), 
надо отсортировать и вывести эти строки в порядке возрастания или 
убывания по подстроке(третьему разделителю), этот код это делает, но 
я не могу понять как:

print join "\n" =>  map  {$_ -> [1]}
                    sort {$a->[0] <=> $b->[0]}
                    map  {[/^#.*#.*#(.*)#/, $_]}
                    grep {!$_{$1}++ if m!^#.*#.*#(.*)#!} @res;  

насколько я понял, нижняя строчка вырезает строки по уникальным 
подстрокам, вторая снизу заполняет какой-то массив(какой???) тем, что 
содержится в переменной $1, треться строчка снизу сортирует (и что 
такое $a и $b, и почему меняя местами буквы - получается сортировка 
reverse), и главное, я не понял, отчего ображение в четвертой строчке 
снизу идет в элементу $_ -> [1], хотя ниже было заполнение $a -> [0]

???
anonymous

Re: сложный вопрос по perl

вообще конструкция map sort map называется преобразованием Рендела Шварца, по поводу $a->[0] это типа насколдько я понимаю, переменная $_, которая служит ссылкой на анонимный массив, но как из [0] происходит ссылка [1] - я не очень понимаю и сам...

vilfred ☆☆ ()

Re: сложный вопрос по perl

> [/^#.*#.*#(.*)#/, $_]

Создает массив из двух элементов. В первом элементе - вырезка, во втором - сама строка. Сортировка происходет по вырезке.

anonymous ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.