my $quad = "[0-9a-fA-F]{0,4}"; my $ipv6addr = "(?:$quad:){2,7}$quad"; sub is_ipv6 { local $_ = $_[0]; return 0 unless m{^$ipv6addr(?:/(\d+))?$}; my $mask = defined($1) ? $1 : 128; # in 5.10: my $mask = $1 // 128; return 0 if /:::/ or /::.*::/ or not /::/ and 7 != tr/:/:/; return ( 0 <= $mask and $mask <= 128 ); }