Вы можете сделать это проще и надежнее с помощью стандартного модуля версии .
sort { version->parse($a) <=> version->parse($b) } @versions
Что касается трубы, это зависит от того, что получает это. Вы можете принять их как аргументы командной строки (т. Е. @ARGV
) или как строки в stdin. Вы можете выводить пробел отдельно или в отдельных строках.
Здесь он принимает версии в виде строк в stdin и выводит их в виде отдельных строк.
#!/usr/bin/env perl
use strict;
use warnings;
use v5.10;
use version;
say join "\n",
sort {
version->parse($a) <=> version->parse($b)
}
map { chomp; $_ }
<STDIN>;
И это будет использоваться так.
$ echo -e '19.0\n2.9\n0.1.23.45' | sort_versions
0.1.23.45
2.9
19.0
Затем другой конец читает строки из STDIN построчно.
Но если у вас есть сортировка GNU, вы должны использовать sort -V
как Бенджамин В. предложил .