| This first example makes a good solution that works in all cases. |
| Perl Script | Output |
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 Script | Output |
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 Script | Output |
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 Script | Output |
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 <<<
|