use warnings; use strict; # use 5.010; # needs \K regex extension for some regexes use Test::More 'no_plan'; use Test::NoWarnings; use Data::Dump qw(pp); note "\n === all test cases are with and without terminating newlines ===\n\n"; my @tests = ( 'simple cases - no tab separator', [ qq{\n}, qq{\n} ], [ qq{}, qq{} ], [ qq{1\n}, qq{1\n} ], [ qq{1}, qq{1} ], 'simple cases - tab separator(s), no null fields', [ qq{1\t23\n}, qq{1\t23\n} ], [ qq{1\t23}, qq{1\t23} ], [ qq{1\t23\t456\n}, qq{1\t23\t456\n} ], [ qq{1\t23\t456}, qq{1\t23\t456} ], 'simple cases - only tab(s) (null fields)', [ qq{\t\n}, qq{0\t0\n} ], [ qq{\t}, qq{0\t0} ], [ qq{\t\t\n}, qq{0\t0\t0\n} ], [ qq{\t\t}, qq{0\t0\t0} ], [ qq{\t\t\t\n}, qq{0\t0\t0\t0\n} ], [ qq{\t\t\t}, qq{0\t0\t0\t0} ], 'tabs and digits intermixed (leading/trailing null fields)', [ qq{1\t\n}, qq{1\t0\n} ], [ qq{1\t}, qq{1\t0} ], [ qq{\t1\n}, qq{0\t1\n} ], [ qq{\t1}, qq{0\t1} ], [ qq{1\t\t\n}, qq{1\t0\t0\n} ], [ qq{1\t\t}, qq{1\t0\t0} ], [ qq{\t1\t\n}, qq{0\t1\t0\n} ], [ qq{\t1\t}, qq{0\t1\t0} ], [ qq{\t\t1\n}, qq{0\t0\t1\n} ], [ qq{\t\t1}, qq{0\t0\t1} ], [ qq{1\t\t\t\n}, qq{1\t0\t0\t0\n} ], [ qq{1\t\t\t}, qq{1\t0\t0\t0} ], [ qq{\t1\t\t\n}, qq{0\t1\t0\t0\n} ], [ qq{\t1\t\t}, qq{0\t1\t0\t0} ], [ qq{\t\t1\t\n}, qq{0\t0\t1\t0\n} ], [ qq{\t\t1\t}, qq{0\t0\t1\t0} ], [ qq{\t\t\t1\n}, qq{0\t0\t0\t1\n} ], [ qq{\t\t\t1}, qq{0\t0\t0\t1} ], 'tabs and digits intermixed (no leading/trailing null fields)', [ qq{12\t34\n}, qq{12\t34\n} ], [ qq{12\t34}, qq{12\t34} ], [ qq{12\t\t34\n}, qq{12\t0\t34\n} ], [ qq{12\t\t34}, qq{12\t0\t34} ], [ qq{12\t\t\t34\n}, qq{12\t0\t0\t34\n} ], [ qq{12\t\t\t34}, qq{12\t0\t0\t34} ], 'test cases posted with pm 1220510 (with/without newlines)', [ qq{1\t2\t\t\t2\t\t5\t\t\t\t4\n}, qq{1\t2\t0\t0\t2\t0\t5\t0\t0\t0\t4\n}, ], [ qq{1\t2\t\t\t2\t\t5\t\t\t\t4}, qq{1\t2\t0\t0\t2\t0\t5\t0\t0\t0\t4}, ], [ qq{4\t4\t4\t\t\t4\t\t\t\t3\t\n}, qq{4\t4\t4\t0\t0\t4\t0\t0\t0\t3\t0\n}, ], [ qq{4\t4\t4\t\t\t4\t\t\t\t3\t}, qq{4\t4\t4\t0\t0\t4\t0\t0\t0\t3\t0}, ], [ qq{\t\t4\t4\t\t\t1\t\t\t\t\n}, qq{0\t0\t4\t4\t0\t0\t1\t0\t0\t0\t0\n}, ], [ qq{\t\t4\t4\t\t\t1\t\t\t\t}, qq{0\t0\t4\t4\t0\t0\t1\t0\t0\t0\t0}, ], [ qq{\t1\t5\t6\t\t4\t\t\t\t\t\n}, qq{0\t1\t5\t6\t0\t4\t0\t0\t0\t0\t0\n}, ], [ qq{\t1\t5\t6\t\t4\t\t\t\t\t}, qq{0\t1\t5\t6\t0\t4\t0\t0\t0\t0\t0}, ], ); VECTOR: for my $ar_vector (@tests) { if (not ref $ar_vector) { note $ar_vector; next VECTOR; } my ($string, $expected) = @$ar_vector; (my $got = $string) =~ # the next two regexes work, but need perl version 5.10+ for \K # s{ (?: \A | \t) \K (?= \t) | (?<= \t) (?= (?: \t | \Z)) } # works # s{ (?! \A \Z) (?: \A | \t) \K (?= (?: \t | \Z)) } # works # the next regex works with both pre-5.10 and 5.10+ perl versions s{ (?! \A \Z) (?: \A | (?<= \t)) (?= (?: \t | \Z)) } # works {0}xmsg; ok $got eq $expected, # pp($string, $got, $expected) # for debug pp($string, $got) ; } # end for VECTOR done_testing; exit;