为什么不使用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;
}
我想要的子例程依赖于一个不是子例程本地的数组这一事实困扰着我,这就是为什么我更喜欢将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;
}
请注意,在我将它推入我的数组之前,想要的子例程如何对next
我不想要的任何文件执行 a。@directory_list
同样,我更喜欢嵌入:
find (sub {
next unless /\.jpg$/i; #Skip everything that doesn't have .jpg suffix
push @directory_list, $File::Find::Name;
}
我知道这不是您所问的,但我只是想让您了解该Find::File
模块并向您介绍 Perl 模块(如果您还不了解它们),它可以为 Perl 添加很多功能。