use strict; use warnings; while(){ chomp; my $mask = (split(/\s+/, $_))[2]; print "Mask $mask is ", &Valid($mask), "\n"; } sub Valid { my @octs; local $_ = shift; return 0 if !defined $_; return 0 if m{(?:(?:^|\.)[^0]\d*\.)(?!255)}; return 0 if (@octs = split(/\./, $_)) ne 4; return 0 if grep {!m/^(?:0|3|7|15|31|63|127|255)$/} @octs; return 1; } __DATA__ field1 10.1.253.11 0.0.0.0 field1 10.1.254.0 0.0.0.64 field1 10.1.254.128 0.0.0.63 field1 10.1.158.0 15.255.0.255 field1 10.1.160.0 0.0.0.37 field1 10.1.161.0 0.0.146.255 field1 10.1.161.0 0.0.255 field1 10.1.161.0 0.0.255.255 field1 10.1.161.0 255.0.0.0 field1 10.1.158.0 15.255.255.127