this means the only way to trigger the behaviour on purpose is to pass undef as first parameter. API madness! [...] this behaviour of implicit $_ is not documented at all.
How can something that's not in the API (undocumented) be the basis of a claim of API madness?
I cannot imagine how dismantle is useful.
my @elements = split //, $s;
my $length = @elements;
could be written as
my ($length, @elements) = dismantle($s);
but then again, you can already write
my $length = my @elements = split //, $s;
or
my $length = my @elements = $s =~ /./sg;
since list assignment in scalar context returns the number of elements assigned.
Problems you didn't mention:
- trim and strim don't work when passed an empty string.
- trim and strim don't work when passed the string '0'.
- strim doesn't work if the $delim is more than one character long.
- strim could be written much better.
Problems you mentioned I agree with:
- Allowing undef for the first parameter is unclear, wordy and error-prone.
- Warnings usually provided by substr are not emitted.
- The trim function is badly named.
- The module is poorly named.
- strim doesn't properly convert the delimiter from text to a regex pattern.
- trim could be written much better.
- trim is exported by default.
- strim and dismantle aren't exported.
- The synopsis does does not conform to best practices.
- Badly formatted docs.
- Functions are of very limited usefulness. It's fine to write a module that has easy to implement functions, but not when they are harder to learn than the building blocks to build the functions in the first place.