use strict; use warnings; use Regexp::Common 'net'; use Carp; sub to_ipv4 { my $v6 = shift; unless ($v6 =~ /$RE{net}{IPv6}{-keep}/) { carp "'$v6' is not a valid IPv6 address"; return; } unless ($2 eq '2002') { carp "'$v6' is not a 6to4 IPv6 address"; return; }; my @octets; my @parts = ($4, $3); for my $part (@parts) { unshift @octets, hex substr ($part, -2, 2, '') for 1, 2; } return join '.', @octets; } # Example usage my $v4 = to_ipv4 ($ARGV[0]) // 'invalid'; print "$v4\n";