Chinaunix
标题:
求教探索File::Find模块的深度使用,如过滤文件
[打印本页]
作者:
pigkingone
时间:
2013-10-01 18:30
标题:
求教探索File::Find模块的深度使用,如过滤文件
perl中有个模块,File::Find,搜索目录,文件用的。平时很好用。最近突然思考了一个问题,始终理解不透彻。希望大牛帮忙解析:
代码目的:
假设目录文件量非常大,想提高扫描效率。
工作目标:
有的目录明确知道不需要扫描。我该如何才能排除他们。不是简单的不打印出结果,而是实实在在的不去read这个目录?
我看了下这个模块,暂时看到 两种方法的可能性,我试验了第一种,失败了。。。不知道我哪里理解错了?
顺带第二种我也没信心了,请大家帮忙看看我的代码有什么问题,有什么处理的好方法。
代码:
use 5.010;
use File::Find;
$path=`cd`;
chomp $path;
$option{wanted}=\&want;
$option{untaint}=1;
$option{untaint_skip}=1;
$option{untaint_pattern}=qr\web2$\; #这个匹配,到底是符合规则的才处理,还是符合规则的不处理,应该怎么写?这个参数我
#无论怎么改都没有起到作用,比如我目录下有个子目录web2,照样打印出来了,包括web2的子目录和文件。。。。why。。。
find(\%option,$path);
sub want{
say $File::Find::name;
}
第二个方法,是prepross,这个我只在网上看了有人提到,具体方法和效果也不太理解?
请大牛们帮忙救救。。。。
作者:
wenhq
时间:
2013-10-01 22:00
next if -d $name ;
作者:
pigkingone
时间:
2013-10-01 22:02
回复
2#
wenhq
在什么参数下,什么位置写呢?
我想要的不只是打印结果,而是实实在在的,不去扫描某子目录下的文件。
作者:
wenhq
时间:
2013-10-01 22:04
看下perl 进阶 第7章 :File::Find
作者:
pigkingone
时间:
2013-10-01 22:44
回复
4#
wenhq
是intermediate perl吗?我搜了没有untaint_pattern等关键字啊?能提供更详细的信息吗,谢谢啦。
作者:
wenhq
时间:
2013-10-02 08:11
是讲这个模块的呀!
作者:
pigkingone
时间:
2013-10-02 12:10
回复
6#
wenhq
因为是英文的,我大概扫了下,外加搜索了下我使用的关键参数。是有将,但是好像没有我的代码中的相关参数?
作者:
pigkingone
时间:
2013-10-02 21:13
自己再顶一下。。。
作者:
104359176
时间:
2013-10-03 20:43
这个模块不好用,初学者建议使用 File::Find::Wanted 中提供的简单接口。 find_wanted
To get a list of all files ending in .jpg:
my @files = find_wanted( sub { -f && /\.jpg$/ }, $dir );
For a list of all directories that are not CVS or .svn:
my @files = find_wanted( sub { -d && !/^(CVS|\.svn)$/ }, $dir ) );
It's easy, direct, and simple.
WHY DO THIS? ^
The cynical may say "that's just the same as doing this":
my @files;
find( sub { push @files, $File::Find::name if -f && /\.jpg$/ }, $dir );
复制代码
作者:
dqw233
时间:
2013-10-08 01:14
use 5.010;
use File::Find;
sub want{
say $File::Find::name;
}
$File::Find::skip_pattern = qr/$File::Find::skip_pattern | web2/x; #可以修改skip_pattern,注意加上它的默认值。
find(\&want, '.');
作者:
dqw233
时间:
2013-10-08 01:15
回复
1#
pigkingone
use 5.010;
use File::Find;
sub want{
say $File::Find::name;
}
$File::Find::skip_pattern = qr/$File::Find::skip_pattern | web2/x;
find(\&want, '.');
复制代码
作者:
pigkingone
时间:
2014-08-14 15:32
skip_pattern方法没有试过。
不过我发现prepross这个option参数设置一个回调函数。这个函数中过滤不需要的。retrun需要处理的目标的数组就可以了。
看上去这个应该是起作用了。分享之。
目录多的情况下,还是有意义的
欢迎光临 Chinaunix (http://bbs.chinaunix.net/)
Powered by Discuz! X3.2