Возвращение массивов в Perl - PullRequest
0 голосов
/ 27 ноября 2011

Я работаю над рекурсивной функцией поиска файлов в Perl, которая должна возвращать массив имен файлов. Однако, что происходит, когда я пытаюсь их напечатать, я просто получаю 0. Что я делаю не так?

use strict;
use File::Basename;
use constant debug => 0;

sub isdir {
    return (-d $_[0]);
}

sub isfile {
    return (-f $_[0]);
}

my $level = 0;

#my @fns = ();

sub getfn {
    my @fns = ();
    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";
                push(@fns, $fullpath);
                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--;
    #print @fns;
    return @fns;
}


foreach my $f (<*>) {
    #print "fn: ".$f."\n";
    my (undef, undef, $ext) = fileparse($f, qr"\.[^.]+$");
    if ($ext eq ".bragi") {
    print &getfn($f, $ENV{PWD})."\n";
    }
}

Ответы [ 2 ]

5 голосов
/ 27 ноября 2011

Основная проблема здесь в том, что такая строка:

getfn($line, $path);

на самом деле ничего не делает.Он находит все файлы в подкаталоге, но затем полностью удаляет их.Вам необходимо включить его возвращаемое значение в @fns.

вашего внешнего вызова. Вторая проблема заключается в том, что:

print &getfn($f, $ENV{PWD})."\n";

заставляет возвращаемый массив обрабатываться как скаляр, так чтопечатает число элементов массива, а не содержимое элементов массива.Вы, вероятно, хотите что-то вроде этого:

print "$_\n" foreach getfn($f, $ENV{PWD});
1 голос
/ 27 ноября 2011

Вы никогда не назначаете возвращаемый массив чему-либо, когда вызываете getfn() рекурсивно.Ваше единственное назначение:

my @fns = ();

вверху функции, и это то, что возвращается.

...