.: monkey-mind :.

sheep go to heaven, goats go to hell

Expanding a compressed IPv6 address

For those of us who don't want to load Net::IP every single time :-)

Straightforward:

sub ipv6_expand_1 {
    my $arg = shift;
    $arg = '0::' if $arg eq '::';
    my @a2;
    my @addr = split(':', $arg);
    for my $e (@addr) {
        if (length($e)) {
            push (@a2, substr("0000$e", -4));
        }
        else {
            for my $i (1..(8-int(@addr))) {
                push(@a2, "0000");
            }
        }
    }
    return join(":", @a2);
}

# Test script
for (my $i =0; $i < 0xffff; $i++) {
    $_ = sprintf("%x::%x", 0xffff-$i, $i);
    print ipv6_expand_1($_), "\n";
}

Fast(er):

sub ipv6_expand_2 {
    local($_) = shift;
    s/^:/0:/;
    s/:$/:0/;
    s/(^|:)([^:]{1,3})(?=:|$)/$1.substr("0000$2", -4)/ge;
    my $c = tr/:/:/;
    s/::/":".("0000:" x (8-$c))/e;
    return $_;
}

# Test script
for (my $i = 0; $i < 0xffff; $i++) {
    $_ = sprintf("%x::%x", 0xffff-$i, $i);
    print ipv6_expand_2($_), "\n";
}