2011-11-23 110 views
0

我目前正在编写一个Perl程序,用于读取给定文件(命令行或硬编码),然后递归打印(并打开,如果扩展名为.bragi)列出的文件和目录。例如:perl递归文件读取

~ 
    hello.bragi 
    subdir/ 
~/subdir 
    check.bragi 

其中

master.bragi: 

~/hello.bragi 

hello.bragi: 

subdir/ 

check.bragi: 

main.c 

该计划将打开master.bragi,见hello.bragi上市,打开它找到一个d列出irectory,打开该目录,然后重复。

我现在有这样的代码:

#!/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 

回答

3

一个问题是,你不使用的核心模块File::Find。这旨在使目录遍历更容易。

另一个问题是,你有use strict;注释掉。

另一个问题是,您不会为getfn()的参数创建my变量。至少这是非常规的;使用好的变量名称可以更容易理解代码。

我收回了以前有关File::Find的评论。这里,似乎工作脚本的黑客版本:

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 

#!/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}); 

我在当前目录这样创造了一个测试环境

+0

已编辑,我仍然在努力研究'File :: Find'。评论我的新代码? – tekknolagi

+0

你为什么说“被黑客”? – tekknolagi

+1

因为我改变了它 - 我拿了你原来的东西并改变了它(砍死它)。这些变化并不一定像我想的那样精美,但你至少应该认识到它的可识别性。 –