# подпрограмма valid_ip возвращает IP адрес в случае успешной проверки и undef в противоположном # случае
sub valid_ip {
my @oct = grep { $_ >= 0 && $_ <= 255 && $_ !~ /^0\d{1,2}$/ } split /\./, shift;
return unless @oct == 4;
return join('.', @oct);
}
# более побробное описание этих и других скриптов на http://rassanov.ru/skripty/ip-adres.htm
# valid_ip_1 возвращает 1 в случае валидности IP адреса и undef в противоположном случае
sub valid_ip_1 {
4 == grep { $_ >= 0 && $_ <= 255 && $_ !~ /^0\d{1,2}$/ } split /\./, shift;
}
# valid_ip_2 возвращает IP адрес в случае его валидности и undef в противоположном случае
sub valid_ip_2 {
my @octets = split /\./, shift;
for ( my $i = 0; $i <= 3; $i++ ) {
if ( defined $octets[$i] ) {
return unless ($octets[$i] >= 0 && $octets[$i] <= 255 && $octets[$i] !~ /^0\d{1,2}$/);
} else { $octets[$i] = 0; }
}
return join('.', @octets);
}
# valid_ip_3 возвращает true и валидный IP адрес или false и IP адрес с "подсвеченными" ошибочными # октетами
sub valid_ip_3 {
my @octets = split /\./, shift;
my $osh = 0;
for ( my $i = 0; $i <= 3; $i++ ) {
if ( defined $octets[$i] ) {
unless ($octets[$i] >= 0 && $octets[$i] <= 255 && $octets[$i] !~ /^0\d{1,2}$/) {
$octets[$i] = "<font color='#FF0000'> $octets[$i] </font>";
$osh++;
}
} else { $octets[$i] = 0; }
}
return('true', join('.', @octets)) unless ( $osh );
return('false', join('.', @octets));
}
# valid_ip_4 возвращает тескт ошибки либо 0 в случае валидности IP
sub valid_ip_4 {
my $ip = shift;
return "Не указан IP" unless ( $ip );
return "Недопустимые символы в IP $ip" unless ( $ip =~ m/^[\d\.]+$/ );
return "Недопустимый IP $ip - начинается с точки" if ($ip =~ m/^\./);
return "Недопустимый IP $ip - заканчивается точкой" if ($ip =~ m/\.$/);
# Число октетов
return "Ошибка - IP адрес должен содержать 4 октета" unless ( 3 == ($ip =~ tr/\./\./) );
# Проверка пустых октетов
return "Не указана часть IP - две точки подряд" if ($ip =~ m/\.\./);
# Проверка на допустимый диапазон значений в октете
foreach (split /\./, $ip) {
return "Недопустимое значение в IP адресе $ip - $_" unless ($_ >= 0 && $_ < 256 && $_ !~ /^0\d{1,2}$/ );
}
return 0;
}
# При перепечатке ссылка на сайт http://rassanov.ru и автора обязательна. Дмитрий Рассанов