A '(B)*' template can obviate some split-ing and join-ing (although the marginal array-length checking is no longer present):
c:\@Work\Perl\monks>perl -le
"use warnings;
use strict;
;;
use Test::More 'no_plan';
use Test::NoWarnings;
;;
my @TESTS = (
'degenerate case',
[ [], [], [], ],
'simple cases',
[ [ 0 ], [ 0 ], [ 0 ], ],
[ [ 0 ], [ 1 ], [ 1 ], ],
[ [ 1 ], [ 0 ], [ 1 ], ],
[ [ 1 ], [ 1 ], [ 1 ], ],
'complex cases',
[ [ 0, 1, 0, 1, ],
[ 0, 0, 1, 1, ],
[ 0, 1, 1, 1, ],
],
[ [ 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, ],
[ 0, 0, 1, 1, 0, 1, 0, 1, 0, 1, 1, 1, ],
[ 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, ],
],
);
;;
VECTOR:
for my $ar_vector (@TESTS) {
if (not ref $ar_vector) {
note $ar_vector;
next VECTOR;
}
;;
my ($ar_x, $ar_y, $ar_expected) = @$ar_vector;
;;
use constant TEMPLATE => '(B)*';
my $v1 = pack TEMPLATE, @$ar_x;
my $v2 = pack TEMPLATE, @$ar_y;
my @got = unpack TEMPLATE, $v1 | $v2;
is_deeply \@got, $ar_expected, qq{(@got)};
}
;;
done_testing;
;;
exit;
"
# degenerate case
ok 1 - ()
# simple cases
ok 2 - (0)
ok 3 - (1)
ok 4 - (1)
ok 5 - (1)
# complex cases
ok 6 - (0 1 1 1)
ok 7 - (0 1 1 1 0 1 1 1 1 1 1 1)
1..7
ok 8 - no warnings
1..8
Anonymous Monk: See also How to ask better questions using Test::More and sample data.
Update: Oops... Originally posted with template '(a)*' (which also works, but produces longer intermediate strings) instead of '(B)*': Fixed.
Give a man a fish: <%-{-{-{-<
|