我正在尝试将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)
。
答案 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]