Q:

For what input and arguments will perl split give the result (""), if ever?

To me, it looks like perl split can never give the result (""), i.e. a single-element list whose single element is the empty string. No matter what -- any input, any arguments to split. Can anyone show otherwise? And if not, is this a feature or a bug?
I wanted split to be able to for consistency, but alas:

Note that splitting an EXPR that evaluates to the empty string always
  produces zero fields, regardless of the LIMIT specified.

http://perldoc.perl.org/functions/split.html
E.g.:
$ echo ""|perl -ne 'chomp;print 0+split/x/,$_,-1'
0

$ echo "x"|perl -ne 'chomp;print 0+split/x/,$_,-1'
2

$ echo "xx"|perl -ne 'chomp;print 0+split/x/,$_,-1'
3

$ echo "xxx"|perl -ne 'chomp;print 0+split/x/,$_,-1'
4

A:

And if not, is this a feature or a bug?

Not returning an empty string is not a bug. As per the documentation,

Note that splitting an EXPR that evaluates to the empty string always produces zero fields, regardless of the LIMIT specified.

Can anyone show otherwise?

It's highly unlikely that anyone will be able to find an input for which split return an empty string when it's documented to never return an empty string.

It sounds like you want a list of one item when the input is an empty string, so
length($_) ? split(..., $_, -1) : ""

A:

This is a tentative answer to my own question, pending any further information/correction that may come from others:
There are no inputs and arguments to perl split for which the result will ever be a single-element list containing the empty string.
In order to get a result consistent with the promises 1) "size of result will always be one more than the number of separators (regexp matches)" and 2) "if there are no separators, the result will always be a single-element list whose element is the whole original string", what would normally be a clean function call expression
split /.../

instead needs to be wrapped as follows, including an additional auxiliary array:
@s = split /.../, $_, -1 or push @s, "";

and then @s used where the split /.../ normally would have been.
E.g.:
$ echo ""|perl -ne 'chomp;@s=split/x/,$_,-1 or push @s,"";print 0+@s'
1

$ echo "x"|perl -ne 'chomp;@s=split/x/,$_,-1 or push @s,"";print 0+@s'
2

$ echo "xx"|perl -ne 'chomp;@s=split/x/,$_,-1 or push @s,"";print 0+@s'
3

$ echo "xxx"|perl -ne 'chomp;@s=split/x/,$_,-1 or push @s,"";print 0+@s'
4

Or, alternatively, any code using bare split /.../ and relying on either of the above "promises" needs to be put inside a guard if (length) {...} and the case of length==0 handled in separate code.

