eval

字符串形式:表达式计算


Vsftp:/root/perl/14# cat aa
9
5
1
2
Vsftp:/root/perl/14# cat a1.pl 
open (A,aa);

while ($line = <A>){
  chomp $line;
   $str .=$line; ##将所有的行连接起来
   print "$str is $str
";
  };
print "11111111
";
eval $str;
Vsftp:/root/perl/14# perl a1.pl 
$str is 9
$str is 95
$str is 951
$str is 9512
11111111



##在$str 中放入一些代码
Vsftp:/root/perl/14# cat a2.pl 
$str='$c=$a+$b';
$a=10;$b=20;
eval $str;
print $c;
print "
";
Vsftp:/root/perl/14# perl a2.pl 
30

Vsftp:/root/perl/14# cat a3.pl 
eval ( 5 / 0 );
print $@;
print "
";

Vsftp:/root/perl/14# perl a3.pl 
Illegal division by zero at a3.pl line 1.


Perl会将错误信息放入一个称做$@的变量中


代码块形式:例外处理


在这种形式下,eval 后面跟的是一个代码块,而不再是包含字符串的标量变量

Vsftp:/root/perl/14# cat a3.pl 
eval { $a=10;
       $b=0;
       $c=$a/$b; 
     print "1111111111
";
        };
print $@;
print "
";

Vsftp:/root/perl/14# perl a3.pl 
Illegal division by zero at a3.pl line 3.

Vsftp:/root/perl/14# 


在编译脚本时,Perl 对代码块进行语法检查并生成编译代码,在遇到运行错误时,

Perl 将跳过eval块中剩余的代码,并将$@设置为相应的错误信息。


/**********没有eval 和有eval的区别:

Vsftp:/root/perl/14# cat a3.pl 
 { $a=10;
       $b=0;
       $c=$a/$b; 
     print "1111111111
";
        };
print $@;
print "
";

print "2222222222222222
";
Vsftp:/root/perl/14# perl a3.pl 
Illegal division by zero at a3.pl line 3.


此时程序直接中断,没有继续运行



Vsftp:/root/perl/14# cat a3.pl 
 eval { $a=10;
       $b=0;
       $c=$a/$b; 
     print "1111111111
";
        };
print $@;
print "
";

print "2222222222222222
";
Vsftp:/root/perl/14# perl a3.pl 
Illegal division by zero at a3.pl line 3.

2222222222222222

加上eval后程序出错,但是下面代码继续运行


为了产生自己的错误,你需要使用die,Perl 知道某一段代码是否在eval 块中执行,因此,

当die 被调用时,Perl只是简单的将错误信息复制给全局变量$@,并跳转到紧跟eval块的语句继续执行。

Vsftp:/root/perl/14# cat a3.pl 
 eval { $a=10;
       $b=0;
     open (F,"xx22") ;
     print "1111111111
";
        };
print $@;
print "
";

print "2222222222222222
";
Vsftp:/root/perl/14# perl a3.pl 
1111111111

2222222222222222


Vsftp:/root/perl/14# cat a3.pl 
 eval { $a=10;
       $b=0;
     open (F,"xx22") or die "xx22 $! ";
     print "1111111111
";
        };
print $@;
print "
";

print "2222222222222222
";
Vsftp:/root/perl/14# perl a3.pl 
xx22 No such file or directory  at a3.pl line 3.

2222222222222222











Java/C++ 程序员肯定认出了它们与throw,try 和catch 的相似之处

try 对应于eval块,catch 对应于$@检查,而throw 对应die

原文地址:https://www.cnblogs.com/zhaoyangjian724/p/6198949.html