eichin@apollo.com (Mark Eichin) (05/23/91)
The script (at the end of this message) prints:
Line == <<x_$foo>>
found x-pat
found x-brace-dollar-pat
I would have expected it to print "found x-slash-dollar-pat" as well,
or at least threeslash... I get this output with VAX/BSD perl 3.041
and 4.000, as well as Apollo Domain/OS perl 4.003. (I really do want
pattern matching, not equality checking, and (as the last if clause
shows) I should really be able to do this without eval.) Can anyone
explain to me why I can't simply backslash a dollar sign, as is
implied by the info file,
"Simply quote all the non-alphanumeric characters:
$pattern =~ s/(\W)/\\$1/g;"
#!perl
$_='x_$foo';
$pat = "foo";
print "Line == <<$_>>\n";
if(/x_.$pat/) {
print "found x-pat\n";
}
if(/x_\$$pat/) {
print "found x-slash-dollar-pat\n";
}
if(/x_\\$$pat/) {
print "found x-twoslash-dollar-pat\n";
}
if(/x_\\\$$pat/) {
print "found x-threeslash-dollar-pat\n";
}
if(/x_[\$]$pat/) {
print "found x-brace-dollar-pat\n";
}
_Mark_ <eichin@apollo.hp.com>
CCD-Easttchrist@convex.COM (Tom Christiansen) (05/23/91)
From the keyboard of eichin@apollo.com:
:The script (at the end of this message) prints:
:
:Line == <<x_$foo>>
:found x-pat
:found x-brace-dollar-pat
:
:I would have expected it to print "found x-slash-dollar-pat" as well,
:or at least threeslash... I get this output with VAX/BSD perl 3.041
:and 4.000, as well as Apollo Domain/OS perl 4.003. (I really do want
:pattern matching, not equality checking, and (as the last if clause
:shows) I should really be able to do this without eval.) Can anyone
:explain to me why I can't simply backslash a dollar sign, as is
:implied by the info file,
: "Simply quote all the non-alphanumeric characters:
: $pattern =~ s/(\W)/\\$1/g;"
:
:#!perl
:$_='x_$foo';
:$pat = "foo";
:print "Line == <<$_>>\n";
:if(/x_.$pat/) {
: print "found x-pat\n";
:}
This was found, which makes sense.
:if(/x_\$$pat/) {
: print "found x-slash-dollar-pat\n";
:}
Let's see. This becomes /x_\$foo/. In fact, if you use this pattern
literally, then the match works fine. So I wonder whether it's a bug.
Larry? Are you out there? Is the $foo screwing up and making it
forget that \$ was quoted?
:if(/x_\\$$pat/) {
: print "found x-twoslash-dollar-pat\n";
:}
This time you didn't escape the $, so it's anchoring
at the end of the line. Shouldn't match.
:if(/x_\\\$$pat/) {
: print "found x-threeslash-dollar-pat\n";
:}
There's a literal backslash here due to \\, so it shouldn't match.
On the other hand, it maybe might have worked around the possible
bug in x-slash-dollar-pat, but didn't. I guess that's good.
:if(/x_[\$]$pat/) {
: print "found x-brace-dollar-pat\n";
:}
Yes, and then there's that. It should match and did. I get the same
behavior you describe, back down to 3.018 perl. So I guess I have the
same questions you did.
--tom
--
Tom Christiansen tchrist@convex.com convex!tchrist
"So much mail, so little time." allbery@NCoast.ORG (Brandon S. Allbery KF8NH) (05/24/91)
As quoted from <1991May22.202128.27037@convex.com> by tchrist@convex.COM (Tom Christiansen): +--------------- | From the keyboard of eichin@apollo.com: | :if(/x_\\$$pat/) { | : print "found x-twoslash-dollar-pat\n"; | :} | | This time you didn't escape the $, so it's anchoring | at the end of the line. Shouldn't match. +--------------- Uh, wouldn't the $$ expand to the process ID of Perl, since the backslash is escaped? ++Brandon -- Me: Brandon S. Allbery KF8NH: DC to LIGHT! [44.70.4.88] Internet: allbery@NCoast.ORG Delphi: ALLBERY uunet!usenet.ins.cwru.edu!ncoast!allbery
tchrist@convex.COM (Tom Christiansen) (05/24/91)
From the keyboard of allbery@ncoast.ORG (Brandon S. Allbery KF8NH):
:As quoted from <1991May22.202128.27037@convex.com> by tchrist@convex.COM (Tom Christiansen):
:+---------------
:| From the keyboard of eichin@apollo.com:
:| :if(/x_\\$$pat/) {
:| : print "found x-twoslash-dollar-pat\n";
:| :}
:|
:| This time you didn't escape the $, so it's anchoring
:| at the end of the line. Shouldn't match.
:+---------------
:
:Uh, wouldn't the $$ expand to the process ID of Perl, since the backslash is
:escaped?
Yup, perl seems to scan left to right here, so would pick up $$ before $pat.
Oh well.
--tom
--
Tom Christiansen tchrist@convex.com convex!tchrist
"So much mail, so little time."