Шварца Transform как предложено в Toto's answer, вероятно, самый быстрый способ сортировки строк здесь. Но вы сказали, что новичок в Perl, и мне нравится показывать, как можно сортировать строки традиционно.
Perl имеет sort
function, который сортирует список просто по алфавиту. Но вы можете поставить пользовательскую функцию сравнения и позволить sort
использовать свою функцию для сравнения элементов. Во время своей работы sort
должен непрерывно сравнивать два элемента (= строки) вашего списка и решать, какой из них больше или меньше или равны ли они.
Если вы предоставляете функцию сравнения, то sort
будет называть ее двумя такими элементами, как параметры $a
и $b
. Вам
не нужно
не должны объявлять $a
и $b
, они волшебные и просто там. Ваша функция сравнения может выглядеть следующим образом:
sub by_seqNo
{
# extract the sequence number from $a and $b
my ($seqA) = ($a =~ /seqNo:U\((\d+)/);
my ($seqB) = ($b =~ /seqNo:U\((\d+)/);
# numerically compare the sequence numbers (returns -1/0/+1)
$seqA <=> $seqB;
}
Первые две строки извлечь номера после seqNo:U(
и сохранять их как $seqA
и $seqB
. Третья строка сравнивает эти порядковые номера как целые числа и возвращает результат. В сочетании с функцией sort
это дает:
my @sorted = sort by_seqNo @lines;
Причина Шварца Transform (ST) быстрее, чем это решение, потому что ST делает (дорогой) операцию извлечения SEQNO из ваших линий ровно один раз для каждой строки. С другой стороны, «традиционный» подход извлекает seqNo дважды для каждого сравнения.
Если это * одна строка * вашего входного файла, то мы не можем помочь вам его сортировать: он уже отсортирован! Пожалуйста, взгляните на [* Как я могу задать хороший вопрос? *) (Http://stackoverflow.com/questions/how-to-ask) и [* Справка по редактированию Markdown *) (http://stackoverflow.com/редактирование-помощь). Вы должны предоставить гораздо больше информации. – Borodin