Beefy Boxes and Bandwidth Generously Provided by pair Networks
Keep It Simple, Stupid
 
PerlMonks  

Interpolation in Single-quotes?

by goibhniu (Hermit)
on May 13, 2008 at 19:22 UTC ( [id://686348]=perlquestion: print w/replies, xml ) Need Help??

goibhniu has asked for the wisdom of the Perl Monks concerning the following question:

This is a small thing; I had something unexpected happen. I assumed (always a problem) that single-quoted strings didn't interpolate. Ever. In the following situation, I seem to need an escape-character to keep it from interpolating. If it's not interpolating, why do I need the double-backslash?

This is what fails:

#/usr/bin/perl -lW use strict; use warnings; $\="\n"; my $path = 'C:\chas_sandbox\'; my $otherstring = '//Project/State/Task/Server'; print '$path: '.$path; print '$otherstring: '.$otherstring;
producing:
C:\chas_sandbox> singlequoteinterp.pl Bareword found where operator expected at C:\chas_sandbox\singlequotei +nterp.pl l ine 9, near "/Project/State" (Missing operator before State?) syntax error at C:\chas_sandbox\singlequoteinterp.pl line 9, near "/Pr +oject/Stat e" Bad name after Server' at C:\chas_sandbox\singlequoteinterp.pl line 9.

It seems to think $path starts with 'C:\ and extends all the way down to the singlequote in my $otherstring = '. The single quote in the middle is escaped by the backslash. It accepts //Project/ as some sort of search and replace regexp on the implied $_, and is confused by State all by itself after that.

This works:

#/usr/bin/perl -lW use strict; use warnings; $\="\n"; my $path = 'C:\chas_sandbox\\'; my $otherstring = '//Project/State/Task/Server'; print '$path: '.$path; print '$otherstring: '.$otherstring;
producing:
C:\chas_sandbox> singlequoteinterp.pl $path: C:\chas_sandbox\ $otherstring: //Project/State/Task/Server

I need to escape the backslash so that it doesn't escape the single quote. If it's not interpolating, why do I need to escape anything?

I'm on WindowsXP / Strawberry Perl 5.8:

C:\chas_sandbox> perl -v This is perl, v5.8.8 built for MSWin32-x86-multi-thread Copyright 1987-2006, Larry Wall Perl may be copied only under the terms of either the Artistic License + or the GNU General Public License, which may be found in the Perl 5 source ki +t. Complete documentation for Perl, including FAQ lists, should be found +on this system using "man perl" or "perldoc perl". If you have access to + the Internet, point your browser at http://www.perl.org/, the Perl Home Pa +ge.


#my sig used to say 'I humbly seek wisdom. '. Now it says:
use strict;
use warnings;
I humbly seek wisdom.

Replies are listed 'Best First'.
Re: Interpolation in Single-quotes?
by psini (Deacon) on May 13, 2008 at 19:34 UTC

    From perlop:

    Quote-Like Operators

    * q/STRING/

    * 'STRING'

    A single-quoted, literal string. A backslash represents a backslash unless followed by the delimiter or another backslash, in which case the delimiter or backslash is interpolated.

    Rule One: Do not act incautiously when confronting a little bald wrinkly smiling man.

      ++ This is exactly the doc I couldn't find.

      Thanks to duff and 5mi11er as well. In particular, I found helpful, 5mi11er's distinction between variable interpolation and escaping the delimeter.


      #my sig used to say 'I humbly seek wisdom. '. Now it says:
      use strict;
      use warnings;
      I humbly seek wisdom.
Re: Interpolation in Single-quotes?
by duff (Parson) on May 13, 2008 at 19:32 UTC

    It's not interpolating anything. The normal way to get your string delimiter inside of your string is to prefix it with the \ character. So, for single quoted strings, you have two escape sequences that are understood: \\ and \'. Everything else is literal.

Re: Interpolation in Single-quotes?
by 5mi11er (Deacon) on May 13, 2008 at 19:33 UTC
    Interpolation is short for "variable interpolation", and you are correct, variable interpolation is not done on single quoted strings. But there are many cases where meta-characters will need to be escaped for the string you are working with to act as you expect it to act, and this is one of those cases.

    So you are correct, the backslash single quote makes the perl interpreter believe you intend for the ending single quote to be part of the string which then ends 2 lines later.

    -Scott

Re: Interpolation in Single-quotes?
by toolic (Bishop) on May 13, 2008 at 20:04 UTC
    Other monks have provided the answer you were looking for. A debugging technique I use is to remove as much code as possible to still reproduce the problem. Combining this with use diagnostics;, it may have been more evident what the real issue was, rather than the misleading "Bareword" error.
    #!/usr/bin/env perl use strict; use warnings; use diagnostics; my $path = 'C:\chas_sandbox\'; print $path;

    outputs:

    Can't find string terminator "'" anywhere before EOF at ./686348.pl li +ne 7 (#1) (F) Perl strings can stretch over multiple lines. This message me +ans that the closing delimiter was omitted. Because bracketed quotes +count nesting levels, the following is missing its final parenthesis: print q(The character '(' starts a side comment.); If you're getting this error from a here-document, you may have in +cluded unseen whitespace before or after your closing tag. A good program +mer's editor will have a way to help you find these characters. Uncaught exception from user code: Can't find string terminator "'" anywhere before EOF at ./6863 +48.pl line 7. at ./686348.pl line 7

    Hope this helps.

      I caught on to the problem from the bareword error, but thanks for the reminder about use diagnostics. I always forget that until I'm really desparate.


      #my sig used to say 'I humbly seek wisdom. '. Now it says:
      use strict;
      use warnings;
      I humbly seek wisdom.

Log In?
Username:
Password:

What's my password?
Create A New User
Domain Nodelet?
Node Status?
node history
Node Type: perlquestion [id://686348]
Approved by toolic
help
Chatterbox?
and the web crawler heard nothing...

How do I use this?Last hourOther CB clients
Other Users?
Others meditating upon the Monastery: (3)
As of 2024-04-19 01:11 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    No recent polls found