atom feed7 messages in org.freebsd.freebsd-questionsRe: Perl question
FromSent OnAttachments
Christopher RuedOct 2, 2000 11:00 am 
Mark OvensOct 2, 2000 11:15 am 
Mark OvensOct 2, 2000 11:25 am 
Andresen,Jason R.Oct 2, 2000 11:36 am 
Christopher RuedOct 2, 2000 2:09 pm 
Mark OvensOct 2, 2000 3:34 pm 
Dirk MyersOct 2, 2000 7:21 pm 
Subject:Re: Perl question
From:Mark Ovens (mar@freebsd.org)
Date:Oct 2, 2000 3:34:45 pm
List:org.freebsd.freebsd-questions

On Mon, Oct 02, 2000 at 05:09:50PM -0400, Christopher Rued wrote:

Andresen,Jason R. writes:

BTW, your RE should have a ``*'' as well:

/x.*?y/

Maybe, it depends on exactly what he was trying to get.

The first 3 character match where x and y are the first and third character respectivly, then x.y is exactly what you want. The smallest set of characters that have x and y as boundry values? Then your x.*?y is correct. The smallest set of characters that have x and y as boundries and have at least one character in between them? x.+?y is needed.

The RE I used was precisely what I wanted: x.y (an `x' followed by exactly one character followed by a `y').

When I run the following:

#!/usr/bin/perl $a = "xayxbyxcyxdy"; @s = $a =~ /x.y/; print "\@s is @s\n";

I get:

@s is 1

So, I seem to be getting the truth value rather than the first match in the string. If, however, I wrap the entire RE in a parentheses (make it a subexpression) like so:

Well, () is not strictly a subexpression. It causes whatever is matched to be remembered so that it can be recalled later (using \1, \2, etc.) similar to \(...\) in sed(1).

#!/usr/bin/perl $a = "xayxbyxcyxdy"; @s = $a =~ /(x.y)/; print "\@s is @s\n";

I get the results I wanted to begin with:

@s is xay

(I discovered this shortly after I sent the first message about this).

What confuses me is that if I specify the global option, I do not need to use a subexpression. For example, if I run the following code:

#!/usr/bin/perl $a = "xayxbyxcyxdy"; @s = $a =~ /x.y/g; print "\@s is @s\n";

I get:

@s is xay xby xcy xdy

So, this leaves me with a couple of questions, the main one being: Why the different treatment for single matches and global matches?

and a less important one: Why is there no way to have the first match assigned to a scalar, since we can be sure that there will be at most one match returned?

AIUI, the construct ``$a =~ /x.y/;'' just returns TRUE or FALSE and thus is used in if():

if ($a =~ /x.y/) {

..... }

I would guess that if you specify a global match, or use () to memorize the match then perl(1) saves it because it is reasonable to assume that you require more than TRUE or FALSE.

If you get a definitive answer I'd be interested in knowing what it is.

If anyone can explain this, and/or answer the questions posed above, I'd appreciate it.

-Chris

To Unsubscribe: send mail to majo@FreeBSD.org with "unsubscribe freebsd-questions" in the body of the message