Полезная информация

Advanced Perl Programming

Advanced Perl ProgrammingSearch this book
Previous: 5.2 The Block Form: Exception HandlingChapter 5
Eval
Next: 5.4 Using Eval for Expression Evaluation
 

5.3 Watch Your Quotes

There are some subtleties associated with the way quotes or blocks are interpreted by Perl. Consider the differences between the following statements:

$str = '$c = 10';
#
eval  $str;     # 1 
eval  "$str";   # 2
eval  '$str';   # 3
eval  { $str }; # 4

Cases 1 and 2 have identical results, and cases 3 and 4 behave identically. Can you see why? The trick is to know what the interpreter does before handing it over to eval.

In case 1, Perl gives the contents of $str to eval, just as it would for any other function. Hence eval sees the string '$c = 10', treats it like a little program, and executes it.

In case 2, Perl does variable interpolation on the double-quoted string before handing it over to eval. Again, eval sees the contents of $str, compiles it, and executes it, assigning 10 to $c.

In case 3, the argument to eval is a single-quoted string, which is not expanded during the variable interpolation stage. For this reason, eval sees a hardcoded string (with the characters "$", "s", "t", "r") and treats it like a little program as before. As a standalone program, it is quite useless, of course. Since eval returns the result of the last expression, it returns the value of $str (the string $c = 10). That is, if you say,

$s = eval '$str';

$s will contain $c = 10.

Case 4 is identical to case 3, except that the code inside the block is checked for syntax errors at compile-time (at the same time as the rest of the script).

That's all there is to know about eval. Now, let us see how to use it for expression evaluation, exception handling, and efficiency.


Previous: 5.2 The Block Form: Exception HandlingAdvanced Perl ProgrammingNext: 5.4 Using Eval for Expression Evaluation
5.2 The Block Form: Exception HandlingBook Index5.4 Using Eval for Expression Evaluation