Работаем с IPv4

Периодически возникает задача отвалидировать пользовательский ввод и убедиться что там содержится валидный ipv4. Можно конечно обойтись «\d+.\d+.\d+.\d+», но тогда 999.9999.99999.999999 тоже окажется валидным что не есть хорошо. Вообще конечно правильное решение: распарсить адрес по точкам, побитово его сдвинуть и работать уже с ним.

sub aton{
        my $addr=shift;
        (my $a0, my $a1, my $a2, my $a3)=split('\.',$addr);
        return $a3+($a2<<8)+($a1<<16)+($a0<<24);
}

Но иногда это оверкил и нужно просто убедится что пользователь написал нам нормальный адрес, а не строку типа «abcd», в таком случае можно сделать так:

#!/usr/bin/env perl
while (<STDIN>){
    print $_ if (/^((25[0-5]?|2[0-4]?\d|[01]?\d\d?)\.){3}(25[0-5]?|2[0-4]?\d?|[01]?\d\d?)$/)
}

Результат:

yukra@yukra-ThinkPad-X230 ~ $ echo -e  "192.168.5.35\n1.1.1.1\nasd\n127.0.1.5" | ./test.pl 
192.168.5.35
1.1.1.1
127.0.1.5
yukra@yukra-ThinkPad-X230 ~ $
You can leave a response, or trackback from your own site.

Leave a Reply

Subscribe to RSS Feed