how to open a file which is present in another file recursively in perl
递归打开文件而不破坏Perl中的文件句柄
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | #!usr/bin/perl $set=1; open (MYFILE, 'file1.txt'); $array[$set]=\*MYFILE; printit ($array[$set]); sub printit { ($array[$set])=shift; $fh=<$array[$set]>; while (<$fh>) { chomp($fh); #print data in the file if($fh=~/\.txt/){ #print $fh; open (files,"$fh"); $set=$set+1; printit(*files); $set=$set-1; } } } |
1 2 | file1.txt -file2.txt,file3.txt #assume file2.txt comes before file3.txt file2.txt-file4.txt file3.txt |
我想打开file1.txt并在file1中打印数据,如果我找到文件中的file2.txt打开文件打印数据并递归进行直到文件中不包含和.txt文件,然后返回(transverse a tress)在我们的例子中,file1->file2->file4->file3->file1 end程序。我不知道我的程序为什么不起作用。提前谢谢*
我的看法是:读取一个文件,如果找到文件名(由
我假设文件的所有行都需要先打印,然后再进入下一个文件(如果找到)。下面的代码允许关闭文件句柄;它的一个微小变化使它们保持在一个数组中,并在后面打开。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 | use warnings; use strict; use feature 'say'; my $file = shift @ARGV || 'file.txt'; open my $fh, '<', $file or die"Can't open $file: $!"; recurse_open($fh); sub recurse_open { my ($fh) = shift; my @files; while (<$fh>) { print; if (/\b(.+?\.txt)\b/) { push @files, $1; } } say '---'; foreach my $file (@files) { open my $fh_next, '<', $file or do { warn"Can't open $file: $!"; next; }; recurse_open($fh_next); } } |
这张照片
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | main file file1.txt is in it end of main file --- file one, with a line with file2.txt end of one --- file two, which has a line with file3.txt end of two --- Just the file3, no more filenames. --- |
如果
如果标题中的短语"不销毁文件句柄"意味着文件句柄应保持打开(和收集),那么只需在打开时将其添加到数组中即可。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | open my $fh, '<', $file or die"Can't open $file: $!"; my @filehandles = ($fh); recurse_open($fh, \@filehandles); sub recurse_open { my ($fh, $handles) = @_; ... foreach my $file (@files) { open my $fh_next, '<', $file or do { warn"Can't open $file: $!"; next; }; push @$handles, $fh_next; recurse_open($fh_next, $handles); } } |
通常(词汇)文件句柄在超出范围时关闭。但是,由于现在每个数组都被复制到一个更大范围内定义的数组中,因此它们将保留为每个数组都有一个引用。
对问题代码的注释。
最严重的错误是对filehandle是什么和做什么的明显误解。表达式
这将返回文件中的一行,这是您应该处理的内容,包括
接下来,您实际上不匹配并捕获文件名,但只匹配
那么,我不认为有必要在
最后:
始终使用
use warnings; 和use strict; 启动程序。这不是什么学究,而是直接帮助捕捉错误,并强制执行一些非常好的实践。始终检查您的
open 呼叫(open ... or ... )使用词汇文件句柄(
my $fh )而不是globs(FH ),它们要好得多。使用open 的三参数版本
如果这是全部目的,您也可以将文件名传递给递归子文件,并让它打开并读取该文件。