Сортировать массив на основе подстроки в элементе массива - PullRequest
0 голосов
/ 27 марта 2019

Есть ли способ сортировки массива на основе подстроки элемента массива.Например, допустим, у меня есть следующий массив:

@myArray = qw("AAA|111|bbb" "CCC|333|ddd" "EEE|444|fff" "GGG|222|hhh");

Я хочу отсортировать этот массив на основе подстроки, начиная с позиции 4 (с нуля), для длины 3 (в первомэлемент массива в моем примере, это было бы "111").

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

Вот как будет выглядеть мой отсортированный вывод:

AAA|111|bbb

GGG|222|hhh

CCC|333|ddd

EEE|444|fff

Кроме того, пока я показываю числа в качестве подстроки в моем примере, там тоже могут быть нечисловые значения.Так что сортировка должна работать и для нечисловых чисел.

Ответы [ 2 ]

1 голос
/ 27 марта 2019

sort может принимать первый параметр, представляющий собой блок кода, который сравнивает два элемента:

#!/usr/bin/perl
use warnings;
use strict;
use feature qw{ say };

my @myArray = qw( AAA|111|bbb CCC|333|ddd EEE|444|fff GGG|222|hhh );


say for sort { substr($a, 4, 3) cmp substr($b, 4, 3) } @myArray;

См. Также substr .

Обратите внимание, что я удалил двойные кавычки из qw(). «qw» означает «слова в кавычках», поэтому кавычки не нужны (на самом деле, они будут частью строк, а это не то, что вы хотели).

Используя модуль Sort :: Key , он может стать еще проще:

use Sort::Key qw{ keysort };
...
say for keysort { substr $_, 4, 3 } @myArray;
0 голосов
/ 27 марта 2019

Какая польза от труб, если это запись полей фиксированной длины?

Если бы вы обрабатывали входные данные как разделенные конвейером значения, ваш код стал бы

say for sort { ( split /\|/, $a )[1] <=> ( split /\|/, $b )[1] } @myArray;

и

use Sort::Key qw( ikeysort );

say for ikeysort { ( split /\|/ )[1] } @myArray;

[ Это не полный ответ, а продолжение Чоробы. ]

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