[comp.lang.perl] Pattern matching

wjb@moscom.UUCP (Bill de Beaubien) (06/12/91)

While working on a Perl script a little while back, I found myself trying
to substitute occurances of the contents of a variable with nothing.  This
is a straight-forward thing, except that the string I was trying to match
on contained parentheses, which Perl took as RE parens rather the text 
parens.  Easy enough to solve, but the solution I came up with just didn't
appeal to me esthetically;  it seems kind of bulky, and I have to wonder
if there isn't a better way.  So, tell me... is there a better way?

This is the code I came up with;  The list I'm trying to remove from is
in $nodes{$elt}, and the pattern I'm trying to remove is in $elt. 

...
	$nodes{$elt} .= join(" ",@list);
	$ptrn=$elt;
	$ptrn=~s/([\(\)])/\\$1/g;
	($nodes{$elt}) =~ s/(.*)$ptrn(.*)/$1$2/
...

-- 
"Bless me, Father; I ate a lizard."
"Was it an abstinence day, and was it artificially prepared?"
-------------------------------------------------------------
Bill de Beaubien / wjb@moscom.com 

tchrist@convex.COM (Tom Christiansen) (06/16/91)

From the keyboard of wjb@moscom.UUCP (Bill de Beaubien):
:While working on a Perl script a little while back, I found myself trying
:to substitute occurances of the contents of a variable with nothing.  This
:is a straight-forward thing, except that the string I was trying to match
:on contained parentheses, which Perl took as RE parens rather the text 
:parens.  Easy enough to solve, but the solution I came up with just didn't
:appeal to me esthetically;  it seems kind of bulky, and I have to wonder
:if there isn't a better way.  So, tell me... is there a better way?
:
:This is the code I came up with;  The list I'm trying to remove from is
:in $nodes{$elt}, and the pattern I'm trying to remove is in $elt. 
:
:...
:	$nodes{$elt} .= join(" ",@list);
:	$ptrn=$elt;
:	$ptrn=~s/([\(\)])/\\$1/g;
:	($nodes{$elt}) =~ s/(.*)$ptrn(.*)/$1$2/
From the FAQ:

    18) How can I quote a variable to use in a regexp?

	From the manual:

	    $pattern =~ s/(\W)/\\$1/g;

	Now you can freely use /$pattern/ without fear of any unexpected
	meta-characters in it throwing off the search.  If you don't know
	whether a pattern is valid or not, enclose it in an eval to avoid
	a fatal run-time error.


I think I might have written it this way:

    # (apparently in some kind of loop?)
    $nodes{$elt}  .= " @list";

    # then once and once only:
    ($ptrn = $elt) =~ s/(\W)/\\$1/g;
    $nodes{$elt}   =~ s/$ptrn//g;



--tom