On Tue, Jan 06, 2009 at 04:41:30PM +0300, Richard Hainsworth wrote:
> Supposed I define
>
> regex digit { [0..9] }
>
> what is the negative?

You need to be careful about what you mean here by "negative".  If you mean 
"match
a single character that is not in the list", then it is as Patrick said.

> By analogy, it should be <!digit> but I cant find this in the Synopses  
> (possibly missed the relevant section).

Any assertion may be negated, including <digit>, but it doesn't mean
the same kind of negative.  <?digit> and <!digit> are positive and
negative lookaheads, so the never match a character.  So

    <-digit>

really means

    <!digit> .

It just happens that . is looking at the same thing as <!digit>, but
there's no requirement that they line up like that.

> Also, suppose I want a 'when' clause to fire when the test is *not* met.  
> What syntax should be used?
>
> So how would I do
> given {
>    when ! /<digit>/ {say 'this is not a digit'} # this does not work
> }

That should work, and so should

    when not /<digit>/

since Boolean expressions are just tested outright and not compared
back to $_.

But in general, since switch statement cases are ordered, you should
usually match the case positively earlier and give it a different,
possibly null, behavior:

    when /^<digit>$/    { }
    when *              { say 'this is not a digit' }

So there is little need for syntactic relief here, I think.

Larry

Reply via email to