• perl eval


    eval  表达式:
    
    eval 块:
    
    eval
    
    在第一种形式,通常称为一个字符串eval 
    
    EXPR 返回值是被解析的和被执行的作为一个小小的Perl程序。
    
    表达式的值(是它本身决定的在标量上下文环境)是有限被解析,
    
    如果这里没有错误,作为一个block执行在当前Perl程序的词法上下文。
    
    
    这意味着,特别情况下, 任何外部的词法变量时可见的,任何包变量设置或者子函数和
    
    格式定义 之后仍旧存在
    
    注意 eval执行值是每次都被解析的, 如果EXPR 被省略, 评估$_.
    
    
    这种形式是典型的用于延迟解析。
    
    如果unicode_eval 功能是被启用( 默认是在5.16或者更多的版本)
    
    EXPR 或者$_ 是作为一个字符串,因此 use utf8 声明没有影响,
    
    源过滤器是被禁止的。
    
    在没有unicode_eval的功能下,
    
    字符串有时候回对待为 字符和作为字节,
    
    取决于内部编码,源过滤器激活eval 展现不稳定,
    
    
    如果字符串扩展一个标量包含一个浮点数.
    
    标量可能扩展为字母,比如  "NaN" or "Infinity"
    
    
    在一个use locale的范围内.
    
    第2中形式中, BLOCK里的代码只被解析一次,在同一时间围绕代码
    
    eval本身是被解析-- 被执行在当前的Perl程序的上下文。
    
    这种形式通常用来捕获异常。
    
    最后的分号,如果有的话,可以从EXPR的值或者BLOCK里省略
    
    
    在这两种形式中, 返回值是最后一个表达式计算的值,
    
    一个return语句也可以使用,就像在子函数里。
    
    表达式提供的返回值是计算为空白的,标量,或列表上下文,
    
    依赖eval 本身的列表上下文。
    
    
    
    如果有一个语法错误或者运行时错误,或者一个"die" 语句被执行,
    
    "eval" 返回undef 在标量上下文环境或者一个空的列表在列表环境,
    
    $@是存放错误信息的。(在5.16之前,一个bug 导致"undef" 被返回在列表上下文对于符号错误,
    
    但是不是运行错误)
    .
    
    如果没有错误, $@是空的字符串。 一个控制流操作像 "last" 或者"goto" 
    
    可以绕过$@设置。
    
    
    要注意的是,使用"eval" 不会沉默perl输出警告道STDERR,
    
    也不会把警告信息塞到$@.
    
    
    需要注意的是,因为"eval" 捕获其他致命的错误, 它是有用的对于确定某个特性(比如 作为socket或者symlink)
    
    是被实现。
    
    
    
    如果你想要捕获错误 当加载一个XS模块, 一些2进制接口的问题(比如Perl 版本倾斜)
    
    可能是致命的  甚至是"eval" 除非$ENV{PERL_DL_NONLAZY} 被设置
    
    
    
    
    如果要执行的代码并没有不同, 你可能使用eval-BLOCK 从一个捕获运行错误的而不招致
    
    每次重新编译的处罚  错误,如果有的话,仍旧返回在$@
    
    
     # make divide-by-zero nonfatal 使被零除 
                    eval { $answer = $a / $b; }; warn $@ if $@;
    
                    # same thing, but less efficient
                    eval '$answer = $a / $b'; warn $@ if $@;
    
                    # a compile-time error
                    eval { $answer = }; # WRONG
    
                    # a run-time error
                    eval '$answer =';   # sets $@
    
    [root@wx03 test]# cat a1.pl
       eval { $answer = $a / $b; }; warn $@ if $@;
    
    [root@wx03 test]# perl a1.pl 
    Illegal division by zero at a1.pl line 1.
    
    
    
    使用 "eval{}"的形式作为一个异常捕获器在libararies 有一些问题。
    
    由于当前的说的破碎的状态(__DIE__)  
    
    你可能希望不要触发 any "__DIE__" hooks
    
    
    #一个私有的理财捕获 对于除以0
    
    [root@wx03 test]# cat a2.pl 
        eval { local $SIG{'__DIE__'}; $answer = $a / $b; };
                    warn $@ if $@;
    [root@wx03 test]# perl a2.pl 
    Illegal division by zero at a2.pl line 1.
    
    
    这是非常重要的,给定的 "__DIE__" hooks 也被称为die, 这有可能改变它们的错误消息
    
    [root@wx03 test]# cat a3.pl 
      # __DIE__ hooks may modify error messages
                    {
                       local $SIG{'__DIE__'} =
                              sub { (my $x = $_[0]) =~ s/foo/bar/g; die $x };
                       eval { die "foo lives here" };
                       print $@ if $@;                # prints "bar lives here"
                    }
    [root@wx03 test]# perl a3.pl 
    bar lives here at a3.pl line 5.
    
    
    
    
    
    
    

  • 相关阅读:
    Drawing points
    Drawing text
    Drag & drop a button widget
    Simple drag and drop
    QtGui.QComboBox
    QtGui.QSplitter
    QtGui.QLineEdit
    Java-java中的有符号,无符号操作以及DataInputStream
    Android Studio-设置override及getter/setter方法
    Android Studio-设置switch/case代码块自动补齐
  • 原文地址:https://www.cnblogs.com/hzcya1995/p/13350766.html
Copyright © 2020-2023  润新知