Преобразование Шварца в Perl? - PullRequest
6 голосов
/ 26 июня 2011
my @output =
map $_->[0],
sort{$a->[1] <=> $b->[1]}
map [$_,-s $_],     
@array;   

Может кто-нибудь объяснить код более подробно? Я не могу получить голову или хвост этого ..

Ответы [ 2 ]

10 голосов
/ 26 июня 2011

Читайте снизу вверх:

@array

Массив (имен файлов с учетом последующего использования).

map [$_,-s $_],

Для каждого имени файла получите ссылку на двухэлементный анонимный массив, где первый элемент - это имя файла, а второй - размер в байтах файла. Карта возвращает список этих ссылок на массив.

sort{$a->[1] <=> $b->[1]}

Сортировка списка ссылок на массивы по возрастанию размера файла.

map $_->[0],

Превратить список ссылок на массивы обратно в список имен файлов, но теперь в отсортированном порядке.

my @output =

Сохранить список в @ output.

По функциям это эквивалентно:

my @output = sort { -s $a <=> -s $b } @array;

, но получает размер каждого файла только один раз, а не один раз за сравнение, выполненное сортировкой.

4 голосов
/ 26 июня 2011

В Википедии есть подробное объяснение и анализ

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...