2010-04-13 63 views
5

Tôi có danh sách các IP:

238.51.208.96/28
238.51.209.180-199
238.51.209.100-109
238.51.213.2-254
...

Làm thế nào tôi có thể dễ dàng phân tích chúng? Tôi cần IP đầu tiên và cuối cùng từ phạm vi. Đối với dòng đầu tiên tôi có thể sử dụng Net :: Netmask CPAN module, nhưng tôi có thể làm gì với những dòng khác?Làm cách nào để phân tích cú pháp địa chỉ IP và dải địa chỉ với Perl?

Trả lời

4

Hãy thử Net::IP mô-đun

Nếu mô hình thứ hai không hỗ trợ, bạn có thể cần một số thay đổi ip trong tiến như

238.51.209.180-199 

để

238.51.209.180 - 238.51.209.199 

bằng cách sử dụng một số regex, cho ví dụ:

$range =~ s/^((?:\d+\.){3})(\d+)-(\d+)$/$1$2 - $1$3/gm; 

Full kịch bản:

use warnings; 
use strict; 
use Net::IP; 
my $range = "238.51.209.180-199"; 
$range =~ s/^((?:\d+\.){3})(\d+)-(\d+)$/$1$2 - $1$3/; 
my $ip = new Net::IP ($range) || die; 
print $ip->ip(), "\n"; 
print $ip->last_ip(), "\n"; 
+0

'my $ ip = new Net :: IP (" 238.51.209.180-199 ") || chết, 'đầu ra là' Chết tại ./andrey-zentavr.pl dòng 5.' –

+0

@Kinopiko - thêm một cách giải quyết. – YOU

+0

Tôi đã chỉnh sửa regex của bạn và nó hoạt động ngay bây giờ. –

2

Bạn có thể phù hợp với địa chỉ IP bằng cách sử dụng gói Regexp::Common::net, và vận dụng chúng (và nhận netmasks vv) với bất kỳ số lượng mô-đun trên CPAN, bao gồm Network::IPv4Addr, NetAddr::IPNet::CIDR.

+0

Tôi mong muốn sử dụng smt như thế này: # Kiểm tra, chúng tôi có định dạng phạm vi nào? \t if ($ ipline = ~/^ ((?: \ D + \.) {3}) (\ d +) - (\ d +) $ /) { \t \t $ ipline = ~ s/^ ((?: \ d + \.) {3}) (\ d +) - (\ d +) $/$ 1 $ 2 - $ 1 $ 3 /; \t} –

Các vấn đề liên quan