# split takes a pattern -- even when it is handed a string -- and has rules of
# its own for empty fields at the end, at the start, and for empty input.
# Java's String.split copied the trailing-field rule from here.
use v5.36;

sub fields (@f) { sprintf '%d: (%s)', scalar @f, join ', ', map { defined ? qq{"$_"} : 'undef' } @f }

say "--- empty fields ---";
say 'split /,/, "a,b,,"          ', fields(split /,/, "a,b,,");
say 'split /,/, "a,b,,", -1      ', fields(split /,/, "a,b,,", -1);
say 'split /,/, ",a,b"           ', fields(split /,/, ",a,b");
say 'split /,/, ""               ', fields(split /,/, "");
say "";

say "--- the first argument is a pattern ---";
say 'split ".", "1.2.3"          ', fields(split ".", "1.2.3");
say 'split /\./, "1.2.3"         ', fields(split /\./, "1.2.3");
my $sep = '|';
say 'split $sep, "a|b"           ', fields(split $sep, "a|b"), '   $sep is "|"';
say 'split /\Q$sep\E/, "a|b"     ', fields(split /\Q$sep\E/, "a|b");
say "";

say "--- one space is special ---";
my $padded = "  two  words ";
say q{split ' ', "  two  words "   }, fields(split ' ', $padded);
say q{split / /, "  two  words "   }, fields(split / /, $padded);
say q{split /\s+/, "  two  words " }, fields(split /\s+/, $padded);
say "";

say "--- groups in the pattern come back as fields ---";
say 'split /(,)/, "a,b"          ', fields(split /(,)/, "a,b");
say 'split /(-)|(,)/, "a-b,c"    ', fields(split /(-)|(,)/, "a-b,c");
say "";

say "--- the number of fields you asked for ---";
my ($key, $value) = split /=/, 'next=/search?q=perl';
say q{my ($key, $value) = split /=/, 'next=/search?q=perl'      $value is "}, $value, '"';
($key, $value) = split /=/, 'next=/search?q=perl', 2;
say q{my ($key, $value) = split /=/, 'next=/search?q=perl', 2   $value is "}, $value, '"';
my $count = () = split /,/, "a,b,c,d";
say q{my $count = () = split /,/, "a,b,c,d"                    $count is }, $count;
my $fields = split /,/, "a,b,c,d";
say q{my $count = split /,/, "a,b,c,d"                         $count is }, $fields;
