use strict; use Test::More 'no_plan'; my @good=("www.foo.com","www.411.com","123.34.3.5","web.foo.info", "www.foo.co.uk","aaaa-4-bbbb.cCc.COM"); my @bad = ("foo.23.4.2","foo","23","234.12.4.5.4","2345.23.4.43"); ok(is_valid($_)) foreach @good; ok(!is_valid($_)) foreach @bad; sub is_valid{ my $name = shift; my $name = lc $name; return ($name && $name =~ /^[-\.\w]+\.\w+$/ #at least two levels && ($name !~ /\.\d+$/ || $name =~ /^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}$/) #if last part is digit, better be ip ); }