2016-03-31 25 views
1

我試圖從shell(在調用腳本時)將值傳遞給foreach中的perach函數。通過@ARGS作爲foreach(@ARGS)在Perl中的簡寫

[email protected]:$ 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:

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

輸出2:ERROR

[email protected]:~/projects/learnperl$ perl counter.pl 12..16 
Total args: 1 
[12..16] 

還有其他的方法,通過它來獲取,但我想知道如果我想要實現是可能的。

用法示例:

[email protected]:$ 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)

+2

所以你問如何生成的IP地址192.168.10.10從向192.168.10.60在你的shell?如果是這樣,我們必須知道你正在使用哪個外殼。當然,[你也可以用Perl來做到這一點](http://stackoverflow.com/questions/2279756/how-can-i-generate-a-range-of-ip-addresses-in-perl)。 – ThisSuitIsBlackNot

+1

不,我不是這樣問的。我想知道如何通過使用shell(bash)將'12..16'作爲單獨的@ARGS傳遞,並且Perl應該將其擴展爲'12 13 14 15 16',而不是將其解釋爲1參數,即'12..16' 。 – Moni

回答

3

編輯:由於您提到使用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] 
+1

啊!尼斯。 - 感謝'eval'表達。解決問題。 - '$ script {10..20}'。 **驚人**。 - 稍後將查看「Number :: Range」。 謝謝:) – Moni