Re: [RFC] Text-Balanced 1.96 proposed interface changes: return failure in list context

[email protected] (Damian Conway) Mon, 16 Feb 2004 06:58:39 +1100
Newsgroups perl.recdescent,perl.module-authors
Message-ID <[email protected]>
David Manura wrote:

> As the current maintainer of Text::Balanced,

And *thank-you* for taking on that role, David! :-)


> (2) extract_multiple will recognize only the empty list and (undef, ...) 
> return values from extractor functions as match failures.  This is what 
> the POD currently states, but ('', ...) was previously also recognized 
> as a match failure in the actual code.  Under the new proposal, ('', 
> ...) is not returned by any built-in extractor either on success or 
> failure, so it usually will make no difference.  Custom extractors will 
> be allowed to return ('', ...) on success in the trivial case even 
> though I don't see much practical application for that.

Actually, there's an important one -- "deleting" extracted parts. That is, 
accepting "" as a valid match will allow us to create custom extractors that 
effectively throw away the data they've successfully extracted. That's handy 
for dealing with comments, for example.


> I would have prefered the return value on failure in list context to be 
> the empty list (like the private _match_* functions) since that would 
> permit code like
> 
>   elsif ($grammar =~ m/(?=$ACTION)/gco
>             and do { ($code) = extract_codeblock($grammar); $code })
> 
> in Parse::RecDescent to be rewritten as
> 
>   elsif ($grammar =~ m/(?=$ACTION)/gco
>             and ($code) = extract_codeblock($grammar))
> 
> 
> but some code actually does rely on the $$textref in (undef, $$textref, 
> undef) being there.  Perhaps a 'use' option code be given to enable this 
> behavior.

Returning the "remainder" text supports the "extract-and-remove" metaphor:

	($extracted, $remainder, $pre) = extract_whatever($remainder, @opts);

which, if we just returned empty list would have to be:

	($extracted, undef, $pre) = extract_whatever($remainder, @opts);
	substr($remainder, 0, pos $remainder-1) = "";

which I felt was rather a high price to pay.

I would be fine with a C<use> option to toggle the behaviour though.


Damian