Perl: Double Quotish Evaluation

This first example makes a good solution that works in all cases.
Perl ScriptOutput
my( $a, $b, $c ) = qw/aaa bbb ccc/;

my $rog = '>>> $a "$b"} $c <<<';

printf("%s\n%s\n", $rog, &dqn( $rog ) );

sub dqn{
  ($_ = shift) =~ s/"/\\"/g;
  eval(qq{"$_"});
}

>>> $a "$b"} $c <<<
>>> aaa "bbb"} ccc <<<
 
Here, all is well with this test case, but see the following example shows problems.
Perl ScriptOutput
my( $a, $b, $c ) = qw/aaa bbb ccc/;

$rog = '>>> $a $b $c <<<';

print "$rog\n";
print eval '"' . $rog . '\n"';
print eval qq/"$rog\n"/;
print eval qq{"$rog\n"};
print eval "qq{$rog\n}";
print eval "\\\"$rog\n\\\"";

>>> $a $b $c <<<
>>> aaa bbb ccc <<<
>>> aaa bbb ccc <<<
>>> aaa bbb ccc <<<
>>> aaa bbb ccc <<<
 
If the string contains quotes, we get problems with all but one. The last one can also fail. See the next example.
Perl ScriptOutput
my( $a, $b, $c ) = qw/aaa bbb ccc/;

$rog = '>>> $a "$b" $c <<<';

print "$rog\n";
print eval "qq{$rog\n}";

# These all fail.
# print eval '"' . $rog . '\n"';
# print eval qq/"$rog\n"/;
# print eval qq{"$rog\n"};
# print eval "\\\"$rog\n\\\"";

>>> $a "$b" $c <<<
>>> aaa "bbb" ccc <<<
 
We had got aroung quote problems using {}, but if these are unbalanced, they also fail.
Note: The 2nd example here ('Works ?') works or fails depending on the perl version.
Perl ScriptOutput
my( $a, $b, $c ) = qw/aaa bbb ccc/;

$rog = '>>> $a "$b" $c <<<';

##### Works #####
$rog = '>>> $a {"$b"} $c <<<';
print eval "qq{$rog\n}";

##### Works ? #####
$rog = '>>> $a {"$b" $c <<<';
print eval "qq{$rog\n}";

##### Breaks #####
$rog = '>>> $a "$b"} $c <<<';
print eval "qq{$rog\n}";

Scalar found where operator expected at
(eval 3) line 1, near "qq{>>> $a "$b"} $c"
>>> aaa {"bbb"} ccc <<<


Roger
Roger Hall
COMPUSPEC
Google
 
Web Compuspec.net
Valid XHTML 1.0!
Valid CSS!