in reply to Re: Validating Regular Expression
in thread Validating Regular Expression

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.