6 # Accept also a binary string instead of hexadecimal one:
7 $data =~ s/./sprintf("%04b", hex $&)/ge if $data =~ /[2-9A-F]/;
12 $data =~ s/.{$bits}/$rv = eval "0b$&"; ''/e;
13 # say "chop_bits($bits) = $rv";
21 $ver_sum += chop_bits(3);
22 my $type = chop_bits(3);
34 $result .= "op$type(";
36 my $subparts = chop_bits(11);
37 parse() for 1 .. $subparts;
39 my $sublen = chop_bits(15);
40 my $len = length $data;
41 parse() while $len - length($data) < $sublen;
47 use List::Util qw(sum product min max);
50 sub op1 { product @_; }
53 sub op5 { $_[0] > $_[1] ? 1 : 0 }
54 sub op6 { $_[0] < $_[1] ? 1 : 0 }
55 sub op7 { $_[0] == $_[1] ? 1 : 0 }
59 say "versions = $ver_sum";
60 say $result, ' = ', eval $result;