Как передать диапазон чисел (например, от 100 до 200) в качестве аргумента командной строки в Perl? - PullRequest
0 голосов
/ 23 января 2019

У меня есть программа Perl, которая принимает аргументы командной строки .. Я хочу передать числа от 100 до 200 в качестве одного аргумента. Поскольку сложно дать все числа от 100 до 200, есть ли возможность использовать оператор диапазона в аргументе командной строки?

./my_program --target 100..200

Ответы [ 2 ]

0 голосов
/ 23 января 2019

Set :: IntSpan справляется с трудоемкостью разбора диапазонов:

#!/usr/bin/env perl

use strict;
use warnings;
use 5.010;

use Getopt::Long;
use Set::IntSpan;

GetOptions( 'target=s' => \( my $target ) );

my $set = Set::IntSpan->new( $target );

while( my $item = $set->next ) {
    say $item;
}

с результатами:

% perl myprogram.pl  --target 1-10,12-15
1
2
3
4
5
6
7
8
9
10
12
13
14
15
0 голосов
/ 23 января 2019

Как насчет этого?

#!/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
...