Perl: 什么时候需要 close 文件句柄?
Perl 可以使用 open 函数来打开某个文件并对它进行一些操作,比如:打开一个名为 file.dat 的文件:
然后可以对文件进行一些操作,比如逐行打印它的内容: while?(<$fh>)?{ 然后程序可以结束了,这时有两种意见: 一种意见认为应该把 $fh 这个文件句柄关闭掉,用 close 函数: close?$fh; 这样子看起来与 open 遥相呼应,程序美观。 另一种意见认为不用写,直接运行程序就行,程序一结束,文件句柄就自动关闭了。更何况,我在这里使用了 my 来声明文件句柄变量 $fh,也就是说它的作用范围只会局限在该区域内,所以应该是非常安全的。 然而,下面这种情况就有问题了。读者自己可以亲自在 UNIX 上尝试,需要在当前目录下也放一个 file.dat 文件(里面随便写什么都行):
虽然上面这些操作看起来匪夷所思,但不要怀疑,我在工作中还真用到了类似的操作(创建临时目录->操作文件->删除临时目录)。 这个程序在 Ubuntu 12.04 上运行起来完全正常,但是在诸如 Red Hat Enterprise Linux Server release 5.5 等“老操作系统”上就出问题了,而且还是严重错误:
然后,你会在当前目录下面发现程序创建的临时目录 tmp,看这个错误提示,是 tmp 目录里面还有东西,所以无法删除。可是参看一下 tmp 目录,发现里面什么东西也没有,哪怕使用 ls -al 命令(显示所有隐藏文件)来查看,也是什么都没有? 奇怪,明明 tmp 目录里面什么都没有,系统却硬说它不是空的,这是灵异事件吗?过去两年来,我还真的在电脑上遇到过许多无法用常理解释的灵异事件。不过,后来有一些是真相大白了。 其实,只要在第16行添上一句话就对了: 想想也没错,已经打开了一个文件,还没关闭它,就想把它删除了,这可能吗?然而在比较新的版本中这确实可以了(是操作系统比较新还是Perl版本比较新?没仔细研究过),只是在老的机器上出问题了。由于Perl的警告报错机制也并非百分之百正确,所以才会出现明明是空目录却硬说它“不空”的灵异现象。其实,那个目录里可能隐藏了一些IO信号,你用ls未必能看到它们。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |