将@ARGS作为简写传递给Perl中的foreach(@ARGS)

时间:2016-03-31 21:01:23

标签: perl

我正在尝试将shell中的值传递给Perl中的foreach函数(同时调用脚本)。

user@system:$ perl perl_script @ARGS

动机:我列出了50个开关。 192.168.10.10至192.168.10.60 并且必须对所有人执行某些操作。所以试着把它作为速记传递。

#!/usr/bin/perl
my $t_args = $#ARGV+1;
print "Total args: $t_args\n";
print "[$_]\n" foreach @ARGV;

输出1:

user@system:~/projects/learnperl$ perl counter.pl 12 13 14 15 16
Total args: 5
[12]
[13]
[14]
[15]
[16]

输出2:错误

user@system:~/projects/learnperl$ perl counter.pl 12..16
Total args: 1
[12..16]

还有其他方法可以解决这个问题,但我想知道我想要实现的目标是否可行。

使用示例:

user@system:$ perl getlogs.pl 10..60
my $network="192.168.0"
foreach my $node (@ARGS){
    my $ip="$network.$node";
    get_files_from ($ip);
}

这应该从我的所有设备获取数据。 做foreach my $node (10..60)是可以理解的。但我想使用foreach my $node (@ARGS)

1 个答案:

答案 0 :(得分:3)

编辑:,因为您提到使用bash shell,可以这样做 壳级的范围扩展。你不必改变任何东西 你的初始代码,只需使用:

$ perl getlogs.pl {10..60}

它将向脚本发送51个独立的参数。

您可以使用模块来处理范围,例如Number::Range或执行此操作 如果你确定它的安全性和验证,请使用eval。对于 例如:

my @numbers;

foreach (@ARGV) {
    if (/^\d+\.\.\d+$/) {
        # value is a range, eval it
        my @a = eval "($_)";
        push @numbers, @a;
    } else {
        # value assumed to be numeric, test if you want
        push @numbers, $_;
    }
}

print "Total args: ", scalar @numbers, "\n";
print "[$_]\n" foreach @numbers;

模块方法:

use Number::Range;

# if range detected ...
@a = Number::Range->new( $_ )->range;

小测试:

$ perl test.pl 10 11..14 15 16
Total args: 7
[10]
[11]
[12]
[13]
[14]
[15]
[16]