In general, it's a good idea to just return; on failure, since return 0; will evaluate to TRUE in list context.
First, that's not true. You can't test the truthfulness of a something evaluated in list context, so how can it evaluate to true? I think you are talking about list assignment in scalar context.
sub is_valid { 0 } is_valid() or die "invalid"; # Ok (dies) my $invalid = is_valid() or die "invalid"; # Ok (dies) my ($invalid) = is_valid() or die "invalid"; # XXX (Doesn't die!)
The last is purely the coder doing something wrong.
Secondly, I disagree. A boolean is expected, so return that. Otherwise, you create a function that needlessly returns differently when evaluated in scalar and list contexts. You create a function that returns something differently than expected (and documented?). You rely on the caller to create a boolean from the value you do return. For example, you are forcing people to write
%data = ( foo => !!is_foo(), bar => !!is_bar(), );
instead of
%data = ( foo => is_foo(), bar => is_bar(), );
Returning an empty list would cause the buggy assignment in scalar context to DWIM, but it breaks valid code.
Update: Improved list assignment in scalar context example.
In reply to Re^2: Validating Regular Expression
by ikegami
in thread Validating Regular Expression
by Anonymous Monk
| For: | Use: | ||
| & | & | ||
| < | < | ||
| > | > | ||
| [ | [ | ||
| ] | ] |