my $data = "\000\012\000\144\023\304\003pbx\007example\003com\000:3600"; my ($pri,$weight,$port,$rest) = unpack "S>3A*", $data; my $target=''; $target .= (length($target)?'.':'').$2 while $rest=~/\G([\x01-\xFF])((??{".{".ord($1)."}"}))/saagc; my ($ttl) = $rest=~/\G\x00:(.+)\z/saagc or die "failed to parse"; # - OR - my ($pri,$weight,$port,$target,$ttl) = unpack "S>3Z*A*", $data; $target = join '.', unpack "(C/A)*", $target; $ttl=~s/\A://;