我正在编写一个Perl程序,用于读取给定文件(命令行或硬编码),然后递归打印(如果扩展名为.bragi
,则打开文件和目录)。例如:
~
hello.bragi
subdir/
~/subdir
check.bragi
,其中
master.bragi:
~/hello.bragi
和
hello.bragi:
subdir/
和
check.bragi:
main.c
程序将打开master.bragi
,查看列出的hello.bragi
,打开它以查找列出的目录,打开该目录,然后重复。
我目前有这段代码:
#!/usr/bin/perl -w
use strict;
use File::Basename;
sub isdir {
return (-d $_[0]);
}
sub isfile {
return (-f $_[0]);
}
sub getfn {
my $path = $_[1];
my (undef, undef, my $ext) = fileparse($_[0], qr"\..*");
print "arg:\t".$path."\n";
if ($ext eq ".bragi") {
open FILE, "<", $path.$_[0] or die $!;
my @lines = <FILE>;
foreach my $line (@lines) {
chomp($line);
if (isfile($line)) {
print "file:\t".$path.$line."\n";
}
if (isdir($line)) {
print "DIR:\t".$line."\n";
opendir my ($dh), $path.$line or die "Filename does not exist: $!";
my @files = readdir $dh;
closedir $dh;
#print $files[0].":\t".$path.$line."/\n";
foreach my $f (@files) {
my $next = $path.$line."/";
getfn($f, $next);
}
}
}
}
}
getfn("master.bragi", "/home/tekknolagi/twentytwelve/fs/");
除了我收到No such file or directory at ./files.pl line 19, <FILE> line 3.
我并不完全确定我在做什么。想法?
预期输出(按顺序):
master.bragi
hello.bragi
check.bragi
main.c
答案 0 :(得分:3)
一个问题是您没有使用核心模块 File::Find
。这旨在使目录遍历更容易。
另一个问题是你已use strict;
注释掉了。
另一个问题是您没有为my
的参数创建getfn()
个变量。至少这是一种常规的;使用好的变量名称可以更容易理解代码。
我收回了之前关于File::Find
的评论。以下是您的脚本的黑客版本,似乎有效:
#!/usr/bin/perl -w
use strict;
use File::Basename;
use constant debug => 0;
sub isdir {
return (-d $_[0]);
}
sub isfile {
return (-f $_[0]);
}
my $level = 0;
sub getfn {
my($file, $path) = @_;
my (undef, undef, $ext) = fileparse($file, qr"\.[^.]+$");
$level++;
print "-->>getfn($level): $file : $path\n" if debug;
print "arg:\t$file\t$path ($ext)\n" if debug;
if ($ext eq ".bragi") {
open my $FILE, "<", "$path/$file" or die "Failed to open $path/$file: $!";
my @lines = <$FILE>;
close $FILE;
foreach my $line (@lines) {
chomp($line);
my $fullpath = "$path/$line";
print "---- $fullpath\n" if debug;
if (isfile($fullpath)) {
print "file:\t$fullpath\n";
getfn($line, $path);
}
elsif (isdir($fullpath)) {
print "DIR:\t$fullpath\n";
opendir my ($dh), $fullpath or
die "$fullpath does not exist or is not a directory: $!";
my @files = readdir $dh;
closedir $dh;
foreach my $f (@files) {
getfn($f, "$fullpath");
}
}
}
}
print "<<--getfn($level)\n" if debug;
$level--;
}
getfn("master.bragi", $ENV{PWD});
我在当前目录中创建了一个测试环境,如下所示:
mkdir subdir
echo hello.bragi > master.bragi
echo subdir > hello.bragi
echo main.c > subdir/check.bragi
echo hello > subdir/main.c
命令的输出是:
file: /Users/jleffler/tmp/soq/hello.bragi
DIR: /Users/jleffler/tmp/soq/subdir
file: /Users/jleffler/tmp/soq/subdir/main.c