сортировать числа по цифрам и строки по алфавиту в массиве perl - PullRequest
2 голосов
/ 28 мая 2020

Это очень простая проблема, но я не могу ее решить. У меня есть массив

@arr = qw(txt text anothertext 38.09 100.87 0.876)

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

@sorted_as = (anothertext text txt 100.87 38.09 0.876)

или

@sorted_des = (txt text anothertext 100.87 38.09 0.876)

Извините, если я продублирую любой вопрос, но не смог найти подходящий ответ.

Ответы [ 2 ]

4 голосов
/ 28 мая 2020

Разделите на 2 списка, отсортируйте каждый по отдельности, затем снова объедините в один список.

use warnings;
use strict;

my @arr = qw(txt text anothertext 38.09 100.87 0.876);

my @word =         sort {$a cmp $b} grep {  /^[a-z]/i } @arr;
my @num  = reverse sort {$a <=> $b} grep { !/^[a-z]/i } @arr;
my @sorted_as = (@word, @num);
print "@sorted_as\n";

Вывод:

anothertext text txt 100.87 38.09 0.876

Чтобы получить также des, добавьте следующие строки:

@word = reverse @word;
my @sorted_des = (@word, @num);
print "@sorted_des\n";
0 голосов
/ 28 мая 2020

Использование Sort :: Key :: Multi :

# urns = (u)nsigned int, (r)everse (n)umber, (s)tring
use Sort::Key::Multi qw( urnskeysort );

my @sorted =
   urnskeysort {
      /^[0-9]/
         ? ( 1, $_, "" )
         : ( 0, 0, $_ )
   }
      @unsorted;

Точно так же вы можете использовать urnrskeysort для второго порядка.

...