首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Perl中返回数组

在Perl中返回数组
EN

Stack Overflow用户
提问于 2011-11-27 05:13:40
回答 2查看 290关注 0票数 0

我正在开发Perl中的一个递归文件查找函数,该函数应该返回一个文件名数组。然而,当我尝试打印它们时,我得到的却是0。我做错了什么?

代码语言:javascript
复制
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";
    }
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-11-27 05:21:22

这里的主要问题是像这样的行:

代码语言:javascript
复制
getfn($line, $path);

什么也做不了。它会找到子目录中的所有文件,但随后会将它们完全丢弃。您需要将其返回值合并到外部调用的@fns中。

第二个问题是:

代码语言:javascript
复制
print &getfn($f, $ENV{PWD})."\n";

强制将返回的数组视为标量,因此它打印数组元素的数量,而不是数组元素的内容。你可能想要这样的东西:

代码语言:javascript
复制
print "$_\n" foreach getfn($f, $ENV{PWD});
票数 5
EN

Stack Overflow用户

发布于 2011-11-27 05:17:49

当您以递归方式调用getfn()时,不会将返回的数组赋给任何对象。你唯一的任务是:

代码语言:javascript
复制
my @fns = ();

在函数的顶部,这就是返回的内容。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8281649

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档