为什么不使用File::Find模块?自Perl 5.x以来,它几乎包含在Perl的所有发行版中。这不是我最喜欢的模块,因为它的工作方式很混乱,但它做得很好。
可以定义你想要做的是什么wanted
子程序,并过滤掉你不想要的东西。在这种情况下,您几乎可以打印所有内容,因此所有wanted
都会打印出找到的内容。
在File::Find
中,文件的名称保存在$File::Find::name
中,该文件的目录在$File::Find::dir
中。 $_
是文件本身,可用于测试。
这里有你想要的一个基本途径:
use strict;
use warnings;
use feature qw(say);
use File::Find;
my $directory = `/tmp/test`;
find (\&wanted, $directory);
sub wanted {
say $File::Find::Name;
}
我宁愿把我的wanted
功能在我find
子程序,所以他们在一起。这相当于以上内容:
use strict;
use warnings;
use feature qw(say);
use File::Find;
my $directory = `/tmp/test`;
find (
sub {
say $File::Find::Name
},
$directory,
);
好的编程说不打印在子程序中。相反,您应该使用子例程来存储和返回数据。不幸的是,find
根本没有返回任何东西。你必须使用一个全球阵列捕捉到的文件列表,后来把它们打印出来:
use strict;
use warnings;
use feature qw(say);
use File::Find;
my $directory = `/tmp/test`;
my @directory_list;
find (
sub {
push @directory_list, $File::Find::Name
}, $directory);
for my $file (@directory_list) {
say $file;
}
或者,如果你喜欢一个独立的wanted
子程序:
use strict;
use warnings;
use feature qw(say);
use File::Find;
my $directory = `/tmp/test`;
my @directory_list;
find (\&wanted, $directory);
sub wanted {
push @directory_list, $File::Find::Name;
}
for my $file (@directory_list) {
say $file;
}
事实证明我的通缉子程序取决于数组的子程序困扰我这就是为什么我喜欢嵌入我的find
调用内部的wanted
子程序,这不是地方。
一两件事你可以做的是使用你的子程序来筛选出你想要的东西。比方说,你在JPG文件是唯一感兴趣的是:
use strict;
use warnings;
use feature qw(say);
use File::Find;
my $directory = `/tmp/test`;
my @directory_list;
find (\&wanted, $directory);
sub wanted {
next unless /\.jpg$/i; #Skip everything that doesn't have .jpg suffix
push @directory_list, $File::Find::Name;
}
for my $file (@directory_list) {
say $file;
}
注意通缉子程序如何做之前我把它放到我@directory_list
阵列我不希望任何文件next
。同样,我更喜欢嵌入:
find (sub {
next unless /\.jpg$/i; #Skip everything that doesn't have .jpg suffix
push @directory_list, $File::Find::Name;
}
我知道这是不是正是你问什么,但我只是想让你知道的Find::File
模块并为您介绍Perl模块(如果你没有已经了解它们)可以为Perl添加很多功能。
'文件:: Spec' < - 这个模块有'no_upwards()'FUNC隐藏像'.'或'..'所有目录。例如:'@paths =文件::规格 - > no_upwards(@paths);' – gaussblurinc 2013-04-05 13:01:53
你应该把一个'使用5.012;'在你的程序,因为你用'而(READDIR($ DIR)){...}'这在早期版本中不起作用。 – 2013-04-05 14:59:29