为什么不使用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 根本没有返回任何东西。您必须使用 global 数组来捕获文件列表,然后将它们打印出来:
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;
}
我想要的子例程依赖于一个非本地子例程的数组这一事实困扰着我,这就是为什么我更喜欢将wanted 子例程嵌入到我的find 调用中。
您可以做的一件事是使用您的子例程过滤掉您想要的内容。假设您只对 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 的功能。