Perl 5 - Как работает этот скрипт и что такое @_ и $ _? - PullRequest
0 голосов
/ 29 мая 2018

Я пытаюсь выяснить, что происходит в этом Perl-скрипте. В комментариях я думаю , спасибо, если вы посвятите свое время помощи мне.У меня очень мало опыта работы с Perl, но я немного разбираюсь в сценариях оболочки.

Я думаю, @_ - это список параметров, передаваемых в подпрограмме, а $_ - глобальная переменная, я изо всех сил пытаюсь понятьих реальное назначение в этом сценарии.

#!/bin/perl
sub quick_sort {
    # exit condition, when subset contains less than 2 elements
    return @_ if @_ < 2; 

    # choosing pivot element, using subset as input, rand as random offset, no idea what the 1 is for, man says "int fd_out"
    my $p = splice @_, int rand @_, 1;

    # actual recursion and the main source of my confusion
    # calling quicksort(smaller pivot, pivot, quicksort(greater pivot))
    quick_sort(grep $_ < $p, @_), $p, quick_sort(grep $_ >= $p, @_);
}

# running the damn thing, no greater secrets here, i guess 
my @a = (4, 65, 2, -31, 0, 99, 83, 782, 1);
@a = quick_sort @a;

print "@a\n";

1 Ответ

0 голосов
/ 29 мая 2018
quick_sort(grep $_ < $p, @_), $p, quick_sort(grep $_ >= $p, @_);

Давайте разберем это:

@_ - массив аргументов функции.

$_ - временная скалярная переменная, используемая в качестве заполнителя в некоторых контекстах.

grep $_ < $p, @_

Это выражение, которое использует встроенную функцию grep для создания списка, состоящего из всех элементов из @_, которые удовлетворяют условию $_ < $p - то естьвсе элементы, которые численно меньше, чем сводная.

Полученный список передается в quick_sort, поэтому в результате получается отсортированный список всех элементов, меньших, чем сводная.

То же самое происходит на другой стороне:

quick_sort(grep $_ >= $p, @_);

Это берет все элементы @_, которые больше, чем центр, и сортирует их.

Наконец:

quick_sort(grep $_ < $p, @_), $p, quick_sort(grep $_ >= $p, @_);

Выражение запятой создает список, состоящий из:

  1. Отсортированный список всех аргументов, меньших, чем элемент pivot.

  2. Элемент pivot.

  3. Сортированный список всех аргументовбольше, чем элемент pivot.

И когда вы объедините все это вместе, вы получите отсортированный список всех аргументов функции.

Но этоэто все глупо.Perl имеет встроенную функцию sort;Вы могли бы выразить ту же самую вещь намного более кратко как @a = sort { $a <=> $b } @a, и это фактически было бы намного быстрее.

...