Scott E Robinson wrote:
> Dear Perl communinty,
>
> I don't exactly want to ask this now, since  I just spent much of the
> evening trying to handle this case, but I wonder if there's an easy
> way to
> keep the following regular expression from matching if the string in
> the
> regex is null:
>
> $_ = ":B000:L520:M260:M:88:8:M602:";
> $string_to_match="whatever";
> $count = () = /\b($string_to_match)\b/g;
>
> If $string_to_match is null, whatever's in $_ matches it -- and for
> some
> reason i don't understand it matches twice for every colon-delimited
> piece
> of $_, though that hardly matters.
>
> Is there an easy way to keep the null string from matching anything?
> It would have saved me an evening if I'd known about it.

Hi Scott. Sorry about your wasted evening. As Steve says the
problem is that the \b (word-boundary) assertion is zero-width.
This means that further contents of the regex can match in the
same place in the string. Once your variable contents have been
expanded, the regex becomes /\b()\b/g so both \bs simply match
at the same place.

You can test your $string_to_match before applying the regex or,
in your particular case, you could check that string is surrounded
by non-word characters

    $_ = ":B000:L520:M260:M:88:8:M602:";
    my $string_to_match = "";
    my $count = () = /\W$string_to_match\W/g;
    print $count;

output

    0

If your colons weren't present at each end of the string then
it would still be possible, but slightly less tidy. Note also that
this is specifically for counting matches. If you want to
accumulate the matched contents into a list you would need
to bracket the string, as in

    my @match = /\W($string_to_match)\W/g;
    my $count =- @match;

otherwise the colons will be included in the aray elements.

HTH,

Rob





-- 
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to