这是5个特殊的代码块。要理解这几个块,关键在于几个时间点:

  • (1).程序编译期间
  • (2).程序执行期间
  • (3).程序执行结束但还未退出期间

BEGIN块

  • BEGIN块是在程序编译期间执行的,也就是上面的步骤(1)所在期间
  • 即使程序中出现了语法错误,BEGIN块也会执行
  • 如果出现了多个BEGIN块,则按照FIFO(first in first out)的方式输出,也就是从上到下的顺序

在BEGIN期间可以做一些程序执行之前的操作,例如事先给某个比较特殊的变量赋值,检查文件是否存在,检查操作系统是否满足要求等等。

package Foo;
use strict;
use warnings;
BEGIN {
print "This is the first BEGIN block\n";
} print "The program is running\n"; BEGIN {
print "This is the second BEGIN block\n";
}

由于BEGIN代码块在编译期间执行,程序普通行的print是在执行期间执行,所以上面的代码结果为:

This is the first BEGIN block
This is the second BEGIN block
The program is running

下面程序出现语法错误,但BEGIN也会执行:

BEGIN {
print "This is the first BEGIN block\n";
} print "The program is running\n"; BEGIN {
print "This is the second BEGIN block\n";
}
my $x =;

执行结果:

syntax error at some_program.pl line 8, near "=;"
Execution of some_program.pl aborted due to compilation errors.
This is the first BEGIN block
This is the second BEGIN block

不过上面的error信息不一定会最先输出,因为stdout和stderr是两个独立的文件句柄,无法保证它们之间的顺序。

实际上,use导入模块时如果导入的是空列表,它等价于在BEGIN中使用require语句:

use File::Find ();
# 等价于
BEGIN {
require File::Find;
}

END块

END块是在程序执行结束,但退出前执行的,也就是上面的步骤(3)所在期间。

  • 当触发了die的时候,它们也会执行
  • 但可以通过信号来忽略END
  • 它们的执行顺序是LIFO(last in first out),即从下往上输出
  • END常用来做清理、善后操作
END {
print "This is the first END block\n";
} END {
print "This is the second END block\n";
}

输出结果:注意,先输出second END,再输出first END

This is the second END block
This is the first END block

INIT、CHECK 和 UNITCHECK 块

INIT、CHECK 和 UNITCHECK 块生效于程序编译结束之后、执行之前。所以如果语法错误,它们不会被触发。

  • CHECK在编译结束后立即执行,即上面步骤(1)刚完成之后,输出格式为LIFO
  • INIT紧跟在CHECK之后,也是在步骤(2)之前,输出格式为FIFO
  • UNITCHECK是在perl 5.9.5之后引入的功能。用于解决执行期间require或do或eval导入文件时不触发CHECK和INIT的问题(因为这些语句的导入是在执行期间进行的,而这两个块是在编译期间进行的)。UNITCHECK是在导入的文件刚编译完成之后、执行之前立即执行的
INIT {
print "This is the first INIT block\n";
}
CHECK {
print "This is the first CHECK block\n";
}
INIT {
print "This is the second INIT block\n";
}
CHECK {
print "This is the second CHECK block\n";
}

输出结果:

This is the second CHECK block
This is the first CHECK block
This is the first INIT block
This is the second INIT block

Perl的特殊代码块:BEGIN、CHECK、INIT、END和UNITCHECK的更多相关文章

  1. sql中关于存在就不做操作的代码块

    前言: 在开发中,经常会对数据库表进行新增修改操作,那么如果表中的属性信息已然存在啦!就没必要去做重复的操作了... 代码块 BEGIN SELECT "COUNT"(*) int ...

  2. Ruby学习之代码块

    代码块在其他的语言中都或多或少接触过一些,如perl中sort{$a<=>$b}keys,传入代码块实现按数值排序,在swift中用到闭包,更加深入学习到training closure. ...

  3. 转转转!!java基础一些静态代码块等知识点

    一.代码块: 构造代码块------类中方法的外面:每次调用构造方法都执行: 静态代码块------类中方法的外面,括号前加上static:只执行一次,随着类的加载而执行: static代码块.构造代 ...

  4. 0037 Java学习笔记-多线程-同步代码块、同步方法、同步锁

    什么是同步 在上一篇0036 Java学习笔记-多线程-创建线程的三种方式示例代码中,实现Runnable创建多条线程,输出中的结果中会有错误,比如一张票卖了两次,有的票没卖的情况,因为线程对象被多条 ...

  5. iOS开发系列--Objective-C之协议、代码块、分类

    概述 ObjC的语法主要基于smalltalk进行设计的,除了提供常规的面向对象特性外,还增加了很多其他特性,这一节将重点介绍ObjC中一些常用的语法特性.当然这些内容虽然和其他高级语言命名不一样,但 ...

  6. Java代码执行顺序(静态变量,非静态变量,静态代码块,代码块,构造函数)加载顺序

    //据说这是一道阿里巴巴面试题,先以这道题为例分析下 public class Text { public static int k = 0; public static Text t1 = new ...

  7. [转]iOS代码块Block

    代码块Block是苹果在iOS4开始引入的对C语言的扩展,用来实现匿名函数的特性,Block是一种特殊的数据类型,其可以正常定义变量.作为参数.作为返回值,特殊地,Block还可以保存一段代码,在需要 ...

  8. iOS学习之代码块(Block)

    代码块(Block) (1)主要作用:将一段代码保存起来,在需要的地方调用即可. (2)全局变量在代码块中的使用: 全局变量可以在代码块中使用,同时也可以被改变,代码片段如下: ;//注意:全局变量 ...

  9. iOS 页面跳转传值,属性传值,代理传值,代码块传值,单例传值,通知传值

    有时候我们在页面跳转的时候回传递相应的参数,如,你想把在第一个页面的文本框里的内容显示在第二个文本框中,或者你又想把第二个文本框中的内容改变之后到第一个页面的文本框中,所有,这个时候我们就要用到页面跳 ...

随机推荐

  1. elasticsearch中 refresh 和flush区别(转)

    elasticsearch中有两个比较重要的操作:refresh 和 flush refresh操作 当我们向ES发送请求的时候,我们发现es貌似可以在我们发请求的同时进行搜索.而这个实时建索引并可以 ...

  2. go 闭包

    看程序 package main import "fmt" func main() { f:=test2() fmt.Println(f()) fmt.Println(f()) } ...

  3. python 文件与数据格式化

    https://www.cnblogs.com/li-zhi-qiang/p/9269453.html       文件和数据格式化 https://www.cnblogs.com/li-zhi-qi ...

  4. STM32CubeMX HAL库串口+DMA数据发送不定长度数据接收

    参考资料:1.ST HAL库官网资料 2.https://blog.csdn.net/u014470361/article/details/79206352#comments 一.STM32CubeM ...

  5. java中的抽象类的作用

    抽象函数的作用有很多,我就举一个例子,(mars老师的例子): 打印机: 父类---Printer 子类---HBPrinter 子类----CanonPrinter 测试类----Test //定义 ...

  6. Anfora 自动装载类

    1.目录结构 + Anfora | + Autoload | - ClassLoader.php | - Autoload.php - autoload.php 2.注册类加载器 src/Anfora ...

  7. Office Web addin 踩坑计:替换后台网站为MVC框架时遇到的问题

    Office Web Addin 模板程序的后台本质上是一个网站,你在调试的时候可以发现它的进程是一个32位的IE进程 所以可以把它替换成Asp.net的网站. 替换方法: 1.点击WordRevie ...

  8. ubuntu hadoop环境搭建

    安装Ubuntu系统:这个自行安装 下载jdk:我下的是1.8.0_141d的,下载好后在usr/lib下新建一个jvm的文件夹用来存放Java的文件,下载好的jdk可以在其他地方解压或者jvm里面解 ...

  9. Jenkins获取运行job的用户名

    1. Jenkins获取运行job的用户名 需要安装user build vars plugin 插件,然后就可以取到$BUILD_USER_ID变量. user build vars plugin下 ...

  10. Eclipse常用20个快捷键

    Eclipse常用20个快捷键 1. Ctrl+F : 本文查找Find与替换Replace 2. Ctrl+H : 全局搜索,可按照文件类型搜索 3. Ctrl+1 : 快速修复,能快速的显示光标所 ...