Как насчет этого?
#!/usr/bin/perl
use strict;
use warnings;
use Getopt::Long;
my %options;
GetOptions(\%options, (
'target=s',
))
or die "$!\n";
die "option --target is missing!\n"
unless exists $options{target};
my @list;
if (my($number) = ($options{target} =~ /^(\d+)$/)) {
push(@list, $number);
} elsif (my($start, $end) = ($options{target} =~ /^(\d+)\.\.(\d+)$/)) {
if ($start < $end) {
push(@list, $start..$end);
} else {
push(@list, reverse($end..$start));
}
} elsif (my($first, $others) = ($options{target} =~ /^(\d+)[\s,]((?:\d+[\s,])*\d+)$/)) {
push(@list, $first, split(/[\s,]/, $others));
} else {
die "invalid argument for --target option: $options{target}\n";
}
for my $target (@list) {
print "${target}\n";
}
exit 0;
Пример прогонов:
$ perl dummy.pl --target 1234
1234
$ perl dummy.pl --target 1,4,5,40,17,30
1
4
5
40
17
30
$ perl dummy.pl --target "1 4,5 40 17,30"
1
4
5
40
17
30
$ perl dummy.pl --target 4..10
4
5
6
7
8
9
10
$ perl dummy.pl --target 10..4
10
9
8
7
6
5
4