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

Hello, monks,
I read a string, modify it, and finally it contains: single quote, double quote and more characters, e.g. all kinds of braces. Then I want to make a valid Perl assignment line: $var = string; How could I envelope my string? I can't use single quotes, because string will terminate earlier, does the q{} help?. Can I solve this somehow easily or with core modules?
Bad example (with singlequotes): my $var = '/\Q"'[]{}()/';

Replies are listed 'Best First'.
Re: text has single and double quotes and anychar. how to assign this text?
by Eily (Monsignor) on Aug 20, 2015 at 13:08 UTC

    See the here-doc notation in Quote and Quote like Operators:

    my $string = <<'END';# only END alone on a line can be the delimiter I can say whatever I want here, even ' " \ $var @Hi, or END END print $string;

    Edit: note that a final "\n" will be included, so you may have to chomp your string to remove it.

      Thanks. And another question. If I have a variable somewhere inside a string, which I want to interpolate? How can I envelope?
      my $str = 'smth'; my $var = '/\Q"'[]{}()/ or ${str}';

        The interpolation will happen with the heredoc. Or, make up your own convention, something that will not appear in the text itself, and use s///.

        $variable = 'there'; $string = <<END; Put my variable $variable and !here! END print $string . "\n"; $string =~ s/!here!/$variable/; print $string . "\n";

        Output:

        Put my variable there and !here! Put my variable there and there
        Dum Spiro Spero

        You can use the double-quote-like here-doc format:

        my $string = <<"END"; # Note here I have used double quotes In this string " and ' and all chars work normally, but backslashes mu +st be escaped, and $var is interpolated. END
        If you have interpolation, you'll have to escape your backslashes no matter what (and you'll need to escape other characters depending on your delimiter), there's no "simple" way to have perl interpolate in some places and take the string litteraly in others. So the next best thing might be to use substitution on the litteral string to replace variables by their value, escape all backslashes in your string, or divide it into several parts and use concatenation: my $string = 'Here \ is allowed'.q<Here I can have '>."This interpolates $var".

Re: text has single and double quotes and anychar. how to assign this text?
by Athanasius (Archbishop) on Aug 20, 2015 at 13:55 UTC

    Hello rsFalse,

    does the q{} help?

    Yes, provided you can find a delimiter which you know isn’t in the string:

    use strict; use warnings; my $s1 = q!/\Q"'[]{}()/!; print "$s1\n";

    Output:

    23:39 >perl 1351_SoPW.pl /\Q"'[]{}()/ 23:46 >
    If I have a variable somewhere inside a string, which I want to interpolate?

    You can interpolate with qq{}, but that is problematic: something like \Q is treated, not as 2 separate characters, but as a single escape sequence. In this situation, use concatenation in preference to interpolation:

    use strict; use warnings; my $str = 'smth'; my $var = q!/\Q"'[]{}()/ or ! . $str; print "$var\n";

    Output:

    23:52 >perl 1351_SoPW.pl /\Q"'[]{}()/ or smth 23:52 >

    Hope that helps,

    Athanasius <°(((><contra mundum Iustus alius egestas vitae, eros Piratica,

      Thank you, Athanasius.
      In my case I read line, which has words and some other chars.
      # ... $input = <>; # string which can contain any chars $input =~ s/\b(?=\w)/\$/g; # words prepend with dollar sign print $some_file <<"END"; my \$var = "$input"; END
      I want $some_file to become syntactically correct. I don't know in which place will be variables and which characters will the line contain. And one more problem: if input is "aaa{a}", I prepend "$" sign before 'aaa' and before 'a', I want to have two variables '$aaa' and '$a', but here I will have an interpolation of hash value :/.
      (updated)

        Hello rsFalse,

        I want $some_file to become syntactically correct.

        Do you mean you want to turn a text file into syntactically correct Perl? If so, this sounds like a recipe for disaster. Are you going to eval "$some_file"; after prepending a $ sigil to each word? If the file comes from an untrustworthy source, it could destroy your system. And if from a trusted source, why the need to re-write it? And how do you know in advance that a variable should be prepended with a $, and not an @ or a %?

        This is beginning to look like an XY Problem. Might be a better idea to explain what you’re trying to achieve. It’s likely the monks will be able to steer you towards a better strategy.

        Hope that helps,

        Athanasius <°(((><contra mundum Iustus alius egestas vitae, eros Piratica,