我想递归地处理文件。
我有一个配置文件,这个配置文件可以包含一个“include”语句。一旦确定了include-statment,该文件将被处理。它可能会发生,在再次处理的文件中,一个include-statement可能会出现。
比如说
- config文件
- 第一级工艺路线
- 包括文件(正在处理)
- 二级工艺线
- -包含文件(立即处理)-处理并关闭
- 处理第二级的更多行
- 关闭文件
- 处理更多第一级行
- 关闭文件
为此,我创建了一个子例程:Update - call for sub updated!
my $av_fn_FH;
my $av_tmp_LINE;
my @av_arr_FN;
sub processfile
{
open($av_fn_FH, "<", "$_[0]")
while($av_tmp_LINE = readline($av_fn_FH))
{
if ( substr($av_tmp_LINE,0,7) eq "include" )
{
@av_arr_FN = split(" ", $av_tmp_LINE); # get the filename from the include statement
processfile($av_arr_FN[1]); # process the include file
}
# do something with "normal" lines
}
close($av_fn_FH);
}
这种递归调用子程序的方式不起作用。一旦从子程序返回,HANDLE就被报告为已关闭。
打开语句的文档说:“将内部FILEHANDLE与EXPR指定的外部文件关联。”我希望FILEHANDLE是唯一的!
我会apreciate一些提示如何做到这一点!
1条答案
按热度按时间laawzig21#
你的文件句柄是在子例程的外部声明的;所以当你打开一个新的配置文件时,你可以覆盖这个值,然后关闭它。
一般来说,你想在尽可能小的范围内声明变量,在那里它们被实际使用。