In out example then, ([abc]) matches "a" and stores the value "a" in
$1. Then all occurances of \1 are replaced with "a".
/([abc])[abc]/
says "find me an a, b, or c, save it to $1,a dn find me another a, b, or c"
/([abc])\1/
says "find me an a, b, or c, save it to $1, and then find me another
of whatever it is that was just found"
Thanks for Jay.That explanation is excellent.
2005/11/9, Jay Savage <[EMAIL PROTECTED]>:
> Plese respond to the list and:
>
> "Because it's up-side down".
> "Why is that?"
> "It makes replies harder to read."
> "Why not?"
> "Please don't top-post." - Sherm Pendley, Mac OS X Perl list
>
> On 11/8/05, Jeff Pang <[EMAIL PROTECTED]> wrote:
> > ~/perl> perl -e'$abc="[abc]"; print "matched!\n" if "ab" =~ /($abc)\1/'
> >
> > but:
> >
> > ~/perl> perl -e'$abc="[abc]"; print "matched!\n" if "ab" =~ /$abc$abc/'
> > matched!
> >
> > Why this happen?what is the difference between "/($abc)\1/" and "
> > /$abc$abc/"?Thanks.
> >
> > 2005/11/9, Jay Savage <[EMAIL PROTECTED]>:
> > > On 11/8/05, John W. Krahn <[EMAIL PROTECTED]> wrote:
> > > > Tom Allison wrote:
> > > > > if ($text =~ /(.*?($crlf))\2(.*)/sm) {
> > > > >
> > > > > Do I read this right?
> > > > >
> > > > > the '\2' is a repeat character of the second match
> > > > > where match \1 is (.*?$crlf) and
> > > > > match \2 is $crlf ?
> > > >
> > > > Yes, but you don't really need the capturing parentheses there:
> > > >
> > > > if ( $text =~ /(.*?$crlf)$crlf(.*)/s ) {
> > > >
> > > >
> > > >
> > >
> > > That depends; we don't know the contents of $crlf (although we can
> > > probably guess). But if $crlf has classes and/or logic, interpolating
> > > the variable again will match any of the possiblilities, where the
> > > backreference will only match the literal string previously matched.
> > > Consider the following:
> > >
> > > ~/perl> perl -e'$abc="[abc]"; print "matched!\n" if "aa" =~ /($abc)\1/'
> > > matched!
> > > ~/perl> perl -e'$abc="[abc]"; print "matched!\n" if "ab" =~ /($abc)\1/'
> > >
> > > but:
> > >
> > > ~/perl> perl -e'$abc="[abc]"; print "matched!\n" if "ab" =~ /$abc$abc/'
> > > matched!
>
> when a part of a regex is stored in a vairable, the contents of the
> variable are interpolated before the regex is evaluated, so when the
> match is performed,
>
> "ab" =~ /$abc/
>
> becomes
>
> "ab" =~ /[abc]/
>
> By the same token
>
> "ab" =~ /$abc$abc/
>
> bcaomes
>
> "ab" =~ /[abc][abc]/
>
> each class can match a or b or c, and the entire regex will match aa,
> bb, cc, ab, ac, ba, bc, ca, or cb.
>
> with
>
> /($abc)\1/
>
> however, \1 isn't evaluated until *after* the capturing parentheses do
> their work, and \1 is replaced with whatever was captured--essentially
> the value of $1 at whatever point the engine reaches that point in the
> expression.
>
> the variable is interpolated, so the expression becomes
>
> /([abc])\1/
>
> then the engine begins evaluating the expression. As soon as the
> parentheses capture something, the engine goes through and replaces \1
> with the literal string captured.
>
> In out example then, ([abc]) matches "a" and stores the value "a" in
> $1. Then all occurances of \1 are replaced with "a".
>
> /([abc])[abc]/
>
> says "find me an a, b, or c, save it to $1,a dn find me another a, b, or c"
>
> /([abc])\1/
>
> says "find me an a, b, or c, save it to $1, and then find me another
> of whatever it is that was just found"
>
> Of course, this only matters if the captured value is the result of
> some logic or class operation.
>
> /(ab)ab/
>
> and
>
> /(ab)\1/
>
> and
>
> /(ab){2}/
>
> are functionally equivalent, although the first one is more efficient
> since it doesn't perform and capturing or substitution.
>
> HTH,
>
> -- jay
> --------------------------------------------------
> This email and attachment(s): [ ] blogable; [ x ] ask first; [ ]
> private and confidential
>
> daggerquill [at] gmail [dot] com
> http://www.tuaw.com http://www.dpguru.com http://www.engatiki.org
>
> values of β will give rise to dom!
>