2016-03-31 15 views
1

Değerleri kabuktan Perl'deki foreach işlevine (betiği çağırırken) geçirmeye çalışıyorum.Perl'de @ARGS foreach'a (@ARGS) kısa yoldan geçmek

[email protected]:$ perl perl_script @ARGS 

Motivasyon: 50 anahtarın bir listesini hazırladım. 192.168.10.10 - 192.168.10.60 ve tüm işlemlerin gerçekleştirilmesi. bu yüzden kısa yoldan geçmeye çalışıyorum.

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

Çıktı 1:

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

Çıktı 2: HATA

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

Orada içinden almak için başka yollar vardır, ancak ben başarmak için çalışıyorum bilmek istiyorum mümkün.

Örnek kullanım:

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

Hepsi benim cihazlardan veri almak gerekir. foreach my $node (10..60) yapmak anlaşılabilir. Ama ben foreach my $node (@ARGS) kullanmak istiyorum.

+2

Eğer 192.168.10.10 den 192.168.10.60 IP adreslerini oluşturmak için nasıl soruyorsun Kabuğunda mı? Eğer öyleyse, hangi kabuğun kullanıldığını bilmek zorundayız. Tabii ki, [bunu Perl ile de yapabilirsiniz] (http://stackoverflow.com/questions/2279756/how-can-i-generate-a-range-of-ip-addresses-in-perl). – ThisSuitIsBlackNot

+1

Hayır .. Bunu sormuyorum. Kabuk (bash) kullanarak ayrı bir @ARGS olarak 12..16'yı nasıl geçebileceğimi bilmek istiyorum ve Perl bunu '12 13 14 15 16'ya genişletmeli ve 1 argüman olarak yorumlanmamalıdır' 12..16' . – Moni

cevap

3

Düzenleme:, bash kabuğunu kullanarak bahsettiğinizden beri, kabuk düzeyinde aralık genişletme yapmak mümkündür.

$ perl getlogs.pl {10..60} 

Ve senaryoya 51 ayrı argümanlar gönderecektir: Sadece kullanın İlk kodunda herhangi bir değişiklik gerekmez.


Sen Number::Range gibi, aralık işlemek için bir modülü kullanmak veya ağın güvenlik ve doğrulama hakkında eminseniz eval ile o yapabilirsiniz. Örneğin:

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; 

modül yaklaşımı:

use Number::Range; 

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

Küçük testi: Yani

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

Ahh! Güzel. - 'eval' ifadesi için teşekkürler. Problemi çözer. - '$ script {10..20}'. ** ** Şaşırtıcı. - Daha sonra “Number :: Range” 'e bakacağız. Teşekkürler :) – Moni

İlgili konular