Цепочки regexов

May 08, 2015 14:50



sub ipv6squeeze ($) { $_[0] =~ s#(^|:)0+#$1#gr =~ s#:::+#::#gr }

пример )

perl, perl regexp

Leave a comment

Comments 2

nbuwe May 10 2015, 20:23:40 UTC
Переводит 2a01:00d0:ffff:0000:0001:0000:0000:0002 в 2a01:d0:ffff::1::2 - хотя двух :: быть не может :)

Reply

ocehb May 19 2015, 11:04:30 UTC


# perl -le 'print sub { $_[0] =~ s#0+([[:xdigit:]]+)(:|$)#$1$2#gr =~ s#(:0){2,}#:#r }->($ARGV[0])' \
0001:0000:0000:0001:0000:0000:0001:0001
1::1:0:0:1:1
# perl -le 'print sub { $_[0] =~ s#0+([[:xdigit:]]+)(:|$)#$1$2#gr =~ s#(:0){2,}#:#r }->($ARGV[0])' \
02a1:00d0:ffff:0000:0001:0000:0000:0002
2a1:d0:ffff:0:1::2

unsqeeze будет выглядеть более безобразно:

# print 0001:0000:0000:0000:0000:0000:0001:0001 | \
perl -lne 'print sub { $_[0] =~ s#0+([[:xdigit:]]+)(:|$)#$1$2#gr =~ s#(:0){2,}#:#r }->($_)' | \
perl -lne 'my @a=split":"; print join ":", map { sprintf "%04x", hex($_) } $#a == 7 ? @a : ( map { $_ ne "" ? $_ : (0)x(8-$#a) } @a )'
0001:0000:0000:0000:0000:0000:0001:0001

Может потом причешу.

Reply


Leave a comment

Up