perl递归文件读取

时间:2011-11-23 03:54:37

标签: perl file path

我正在编写一个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

1 个答案:

答案 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