Perl: 什么时候需要 close 文件句柄?

Perl 可以使用 open 函数来打开某个文件并对它进行一些操作,比如:打开一个名为 file.dat 的文件:

open my $fh, "<", "file.dat";

然后可以对文件进行一些操作,比如逐行打印它的内容:

while (<$fh>{
   print;
}

然后程序可以结束了,这时有两种意见:

一种意见认为应该把 $fh 这个文件句柄关闭掉,用 close 函数:

close $fh;

这样子看起来与 open 遥相呼应,程序美观。

另一种意见认为不用写,直接运行程序就行,程序一结束,文件句柄就自动关闭了。更何况,我在这里使用了 my 来声明文件句柄变量 $fh,也就是说它的作用范围只会局限在该区域内,所以应该是非常安全的。

然而,下面这种情况就有问题了。读者自己可以亲自在 UNIX 上尝试,需要在当前目录下也放一个 file.dat 文件(里面随便写什么都行):

01 use File::Copy qw/copy/;
02 use Fatal qw/open close chdir mkdir copy rmdir/;
03 
04 # 创建一个临时目录 tmp
05 mkdir "tmp";
06 
07 # 把文件 file.dat 复制到临时目录 tmp
08 copy "file.dat", "tmp/file.dat";
09 
10 # 进入临时目录 tmp,然后对文件 file.dat 进行某些操作,比如打印它的内容
11 chdir "tmp";
12 open my $fh, "<", "file.dat";
13 while (<$fh>{
14     print;
15 }
16 
17 # 删除该文件
18 unlink "file.dat";
19 
20 # 退出该临时目录,返回上层目录
21 chdir "..";
22 
23 # 删除该临时目录
24 rmdir "tmp";

虽然上面这些操作看起来匪夷所思,但不要怀疑,我在工作中还真用到了类似的操作(创建临时目录->操作文件->删除临时目录)。

这个程序在 Ubuntu 12.04 上运行起来完全正常,但是在诸如 Red Hat Enterprise Linux Server release 5.5 等“老操作系统”上就出问题了,而且还是严重错误:

Can't rmdir(tmp): 目录非空 at (eval 8) line 3
    main::ANON('tmp') called at tmp.pl line 24

然后,你会在当前目录下面发现程序创建的临时目录 tmp,看这个错误提示,是 tmp 目录里面还有东西,所以无法删除。可是参看一下 tmp 目录,发现里面什么东西也没有,哪怕使用 ls -al 命令(显示所有隐藏文件)来查看,也是什么都没有?

奇怪,明明 tmp 目录里面什么都没有,系统却硬说它不是空的,这是灵异事件吗?过去两年来,我还真的在电脑上遇到过许多无法用常理解释的灵异事件。不过,后来有一些是真相大白了。

其实,只要在第16行添上一句话就对了:

close $fh;

想想也没错,已经打开了一个文件,还没关闭它,就想把它删除了,这可能吗?然而在比较新的版本中这确实可以了(是操作系统比较新还是Perl版本比较新?没仔细研究过),只是在老的机器上出问题了。由于Perl的警告报错机制也并非百分之百正确,所以才会出现明明是空目录却硬说它“不空”的灵异现象。其实,那个目录里可能隐藏了一些IO信号,你用ls未必能看到它们。

所以,为了安全起见,所有程序 open 之后请务必 close

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
使用 JavaScript 编写的记忆游戏(附源代码)   项目:JavaScript 记忆游戏(附源代码) 记忆检查游戏是一个使用 HTML5、CSS 和 JavaScript 开发的简单项目。这个游戏是关于测试你的短期 记忆技能。玩这个游戏 时,一系列图像会出现在一个盒子形状的区域中 。玩家必须找到两个相同的图像并单击它们以使它们消失。 如何运行游戏? 记忆游戏项目仅包含 HTML、CSS 和 JavaScript。谈到此游戏的功能,用户必须单击两个相同的图像才能使它们消失。 点击卡片或按下键盘键,通过 2 乘 2 旋转来重建鸟儿对,并发现隐藏在下面的图像! 如果翻开的牌面相同(一对),您就赢了,并且该对牌将从游戏中消失! 否则,卡片会自动翻面朝下,您需要重新尝试! 该游戏包含大量的 javascript 以确保游戏正常运行。 如何运行该项目? 要运行此游戏,您不需要任何类型的本地服务器,但需要浏览器。我们建议您使用现代浏览器,如 Google Chrome 和 Mozilla Firefox, 以获得更好、更优化的游戏体验。要玩游戏,首先,通过单击 memorygame-index.html 文件在浏览器中打开游戏。 演示: 该项目为国外大神项目,可以作为毕业设计的项目,也可以作为大作业项目,不用担心代码重复,设计重复等,如果需要对项目进行修改,需要具备一定基础知识。 注意:如果装有360等杀毒软件,可能会出现误报的情况,源码本身并无病毒,使用源码时可以关闭360,或者添加信任。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值