Perl程序readline报错求助:readline() on closed filehandle IN
解决Perl中readline() on closed filehandle IN报错的问题
兄弟,这个报错的核心原因很明确——你的Perl脚本尝试读取一个没成功打开的文件句柄,说白了就是open(IN,$forward)这行代码没把文件打开,后面的while(<IN>)自然就报错了。咱一步步来解决:
第一步:给open语句加上错误检查(最关键)
你现在的open写法太“粗犷”了,没判断文件到底打开成功没。把原来的代码:
open(IN,$forward);
改成更安全的三参数open,同时加上错误提示:
open(IN, '<', $forward) or die "打不开文件 $forward 啊!原因是: $!";
这样如果文件打不开,脚本会直接输出具体错误(比如“文件不存在”“权限不够”),一下子就能定位问题,不用瞎猜。
第二步:排查文件本身的问题
结合你提到的配置文件信息,咱再排查几个点:
- 先确认
$forward变量对应的文件名是不是你说的那份配置文件?可以在open前加一行打印:print "当前要打开的文件是: $forward\n";,看看输出的路径和文件名对不对——说不定是$snpid变量的值错了,导致生成的文件名根本不存在。 - 检查文件权限:运行脚本的用户有没有读取这个配置文件的权限?Linux下可以用
ls -l 文件名看权限,Windows下右键看属性。 - 关于配置文件第65行的
num_cpus = 40:这内容本身没问题,Perl完全能识别。不过你代码里写了s/\r//;,说明文件可能是Windows格式的(带\r换行符),但这不会导致文件打不开,顶多是读取后处理的问题,先解决open的问题再说。
第三步:额外排查小细节
如果上面两步还没解决,试试用文本编辑器打开配置文件,显示所有隐藏字符(比如VSCode开启“控制字符可见”),看看有没有奇怪的控制字符或者文件损坏的情况;也可以用cat -A 文件名(Linux/macOS)来查看文件的所有内容,确认没有异常。
内容的提问来源于stack exchange,提问作者TwanK
相关产品推荐
相关产品推荐

