use strict; use Test::More; use re::engine::Oniguruma; my @t = ( { pattern => '/(:)/', target => 'a:b', expect => [ 'a', ':', 'b', ], }, # The ' ' special case { pattern => '" "', target => ' foo bar zar ', expect => [ 'foo', 'bar', 'zar', '', undef ], }, # The /^/ special case { pattern => '/^/', target => 'a\nb\nc\n', expect => [ "a\n", "b\n", "c\n" ], }, # The /\s+/ special case { pattern => '/\s+/', target => 'a b c\t d', expect => [ 'a', 'b', 'c', 'd', ], }, # / /, not a special case { pattern => '/ /', target => ' x y ', expect => [ '', 'x', 'y', '', undef, ], }, ); my @m = ( sub { my ( $ar, $test ) = @_; return qq{my $ar = split $test->{pattern}, "$test->{target}"}; }, sub { my ( $ar, $test ) = @_; my $pattern = $test->{pattern}; return unless $pattern =~ m{^/.*?/$}; return qq{my $ar = split qr$pattern, "$test->{target}"}; }, ); plan tests => @m * @t; for my $test ( @t ) { for my $method ( @m ) { my $ar = mk_fixed_len_array( $test->{expect} ); my $split = $method->( $ar, $test ); SKIP: { skip 'nonsensical test' => 1 unless defined $split; my @got = eval $split; die $@ if $@; is_deeply \@got, $test->{expect}, "$split: got fields"; } } } sub mk_fixed_len_array { my $ar = shift; my $len = 'ARRAY' eq ref $ar ? @$ar : $ar; my $name = 'a'; my @vars = map { '$' . $name++ } 1 .. $len; return '(' . join( ', ', @vars ) . ')'; }