【问题标题】:Passing @ARGS as shorthand to foreach(@ARGS) in Perl在 Perl 中将 @ARGS 作为速记传递给 foreach(@ARGS)
【发布时间】:2016-04-01 05:34:42
【问题描述】:

我正在尝试从 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)

【问题讨论】:

  • 所以你问如何在你的shell中生成从192.168.10.10到192.168.10.60的IP地址?如果是这样,我们必须知道您使用的是哪个外壳。当然,you can do that with Perl too.
  • 不..我不是在问这个。我想知道如何使用 shell (bash) 将 12..16 作为单独的 @ARGS 传递,Perl 应该将其扩展为 12 13 14 15 16 而不是将其解释为 1 个参数,即 12..16

标签: perl


【解决方案1】:

编辑: 因为你提到使用 bash shell,所以可以这样做 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]

【讨论】:

  • 啊!好的。 - 感谢eval 的表达。解决问题。 -$ script {10..20}太棒了。 - 稍后会调查Number::Range。谢谢:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-11-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-08-22
相关资源
最近更新 更多