[za-pm] Introducing Darryl Trimming ... with a regex /x modifier problem
James Wright
monkey_vegas at cox.net
Mon May 2 14:35:47 PDT 2011
On 05/02/11 04:47, Anne Wainwright wrote:
>
>
>
> Hi Anne
>
> I've just started learning perl, and found your contact details here
> (http://www.pm.org/groups/522.html) while looking for community help.
> It seems a bit out of date, so please forgive me if I'm knocking on
> the wrong door.
>
B::Deparse's -p option is helpful here:
> I was exploring the "/x" regexp modifier, and came upon some
> unexpected results. Upon closer inspection, my problem lies with the
> ternary operator. I can't see why the following results are
> inconsistent ..
>
> say '1:'.( 'hello' =~ /h e l l o/ )?'true':'false'; #
> no '/x', no match
>
say((('1:' . ('hello' =~ /h e l l o/)) ? 'true' : 'false'));
it evaluates the string '1:' concated with the return of the regex
evaluation, and '1:' is true. This can be seen by replace '1:' with '0'
which is false.
>
> say '2:'.( 'hello' =~ /h e l l o/x )?'true':'false'; #
> '/x' ignores spaces, produces '1'
>
say((('2:' . ('hello' =~ /h e l l o/x)) ? 'true' : 'false'));
While this is 'correct' as 'hello' does match /h e l l o/x, it isn't why
it returns true, it is again a concatenation of '2:' with the result of
the regex match, i.e. '2:1' which is also true.
> say '3:'.( 'h e l l o' =~ /h e l l o/x )?'true':'false'; #
> '/x' ignores spaces, no match
>
say((('3:' . ('h e l l o' =~ /h e l l o/x)) ? 'true' : 'false'));
The same as 1:
>
> say '1:'.( 'hello' =~ /h e l l o/ ).'.'; # no '/x', no match
>
> say '2:'.( 'hello' =~ /h e l l o/x ).'.'; # '/x' ignores spaces,
> produces '1'
>
> say '3:'.( 'h e l l o' =~ /h e l l o/x ).'.'; # '/x' ignores spaces,
> no match
>
> say '1:'.( 'hello' =~ /h e l l o/ ) && 'true.'; # no
> '/x', no match
>
> say '2:'.( 'hello' =~ /h e l l o/x ) && 'true.'; #
> '/x' ignores spaces, produces '1'
>
> say '3:'.( 'h e l l o' =~ /h e l l o/x ) && 'true.'; #
> '/x' ignores spaces, no match
>
More of the same:
> say '1:'.(( 'hello' =~ /h e l l o/ ) + 0) .'.'; # no '/x', no match
>
> say '2:'.(( 'hello' =~ /h e l l o/x ) + 0) .'.'; # '/x' ignores
> spaces, produces '1'
>
> say '3:'.(( 'h e l l o' =~ /h e l l o/x ) + 0) .'.'; # '/x' ignores
> spaces, no match
>
> say '1:'.(( 'hello' =~ /h e l l o/ ) +
> 0)?'true':'false'; # no '/x', no match
>
> say '2:'.(( 'hello' =~ /h e l l o/x ) +
> 0)?'true':'false'; # '/x' ignores spaces, produces '1'
>
> say '3:'.(( 'h e l l o' =~ /h e l l o/x ) +
> 0)?'true':'false'; # '/x' ignores spaces, no match
>
> .. where only the highlighted sections above yield the expected
> results. All the others always return 'true'.
>
> If you can't help, then please point me in the right direction for
> community support.
>
> Many thanks and kind regards
>
> DT
>
'.' is binding closer than the ternary operator, you want something like:
say '2:'.('hello' =~ /h e l l o/x ? 'true' : 'false');
to evaluate the regex match with the ternary operator, not the result of
the concatenation.
>
> _______________________________________________
> Za-pm mailing list
> Za-pm at pm.org
> http://mail.pm.org/mailman/listinfo/za-pm
>
> posts also archived on Mail Archive
> http://www.mail-archive.com/za-pm@pm.org/
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.pm.org/pipermail/za-pm/attachments/20110502/89b26385/attachment.html>
More information about the Za-pm
mailing list