gpt4 book ai didi

Perl:如何以递归方式停止 File::Find 进入目录?

转载 作者:行者123 更新时间:2023-12-03 22:44:31 27 4
gpt4 key购买 nike

我在看 Perl 的 File::Find模块并通过以下方式进行了尝试:

#!/usr/bin/perl

use warnings;
use strict;

use File::Find;

find({wanted => \&listfiles,
no_chdir => 1}, ".");


sub listfiles{
print $File::Find::name,"\n";
}

现在当我运行它时,我得到以下输出:
Noob@Noob:~/tmp$ perl test.pl 
.
./test.txt
./test.pl
./test1.txt
./hello
./hello/temp.txt

现在,我想通过设置 no_chdir=>1如果遇到任何目录,我将使我的代码不进入任何目录。但输出清楚地表明我的代码正在输入 hello目录并列出其文件。

那么,如何更改我的代码以使其行为类似于 ls并且不进入任何目录。我也得到 ./在我的文件/目录名称前面可以删除吗?

我正在使用 Perl 5.14。

最佳答案

$File::Find::prune可用于避免递归到目录中。

use File::Find qw( find );

my $root = '.';
find({
wanted => sub { listfiles($root); },
no_chdir => 1,
}, $root);

sub listfiles {
my ($root) = @_;
print "$File::Find::name\n";
$File::Find::prune = 1 # Don't recurse.
if $File::Find::name ne $root;
}

您可以设置 prune有条件的,如果你愿意的话。
use File::Basename qw( basename );
use File::Find qw( find );

my %skip = map { $_ => 1 } qw( .git .svn ... );

find({
wanted => \&listfiles,
no_chdir => 1,
}, '.');

sub listfiles {
if ($skip{basename($File::Find::name)}) {
$File::Find::prune = 1;
return;
}

print "$File::Find::name\n";
}
no_chdir没有必要——它与你想要做的事情无关——但我喜欢它的作用(防止对 cwd 的更改),所以我把它留在里面。

关于Perl:如何以递归方式停止 File::Find 进入目录?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12334037/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com