我想用perl计算文件夹内的文件数.使用以下代码我可以列出它们,但我不知道如何在perl中计算它们.有帮助吗?
$dir = "/home/Enric/gfs-0.5.2016061400";
opendir(DIR, "$dir");
@FILES = grep { /gfs./ } readdir(DIR);
foreach $file (@FILES) {
print $file, "\n";
}
closedir(DIR);
Run Code Online (Sandbox Code Playgroud)
zdi*_*dim 10
如果您只想计算它们,一旦打开一个目录进行读取,您就可以在readdir上操作上下文,以便返回所有条目的列表,然后将其分配给标量.这为您提供了列表的长度,即.元素的数量
opendir my $dh, $dir;
my $num_entries = () = readdir($dh);
Run Code Online (Sandbox Code Playgroud)
该构造= () =以山羊运营商的名义命名,在perlsecret中看到它.当然,有更明确的方法如下.
如果要计算某些类型的文件,请首先通过grep传递文件列表,就像您一样.由于在其输入上grep强加了列表上下文,因此readdir返回所有文件的列表,并在过滤后grep返回一个列表.当您将其分配给标量时,您将获得列表的长度(元素数量),即.你的数量.例如,对于所有常规文件和/gfs./文件
use warnings;
use strict;
my $dir = '/home/Enric/gfs-0.5.2016061400';
opendir my $dh, $dir or die "Can't open $dir: $!";
my $num_files = grep { -f "$dir/$_" } readdir($dh);
rewinddir($dh); # so that it can read the dir again
my $num_gfs = grep { /gfs./ } readdir($dh);
Run Code Online (Sandbox Code Playgroud)
(这只是一个例子,rewinddir因此它可以正常运行.要真正从目录中获取两种文件,请将所有文件更好地读入数组然后处理)
请注意,readdir返回裸文件名,没有任何路径.因此,对于通常使用文件完成的大多数操作,我们需要在路径前添加它(除非您首先chdir访问该目录).这是在grep上面的块中完成的操作,以便-f 文件测试(-X) 具有正确的文件名.
如果您需要使用文件列表本身,请将其转换为数组,然后将其分配给标量
# Get the file list, then its length
my @files_gfs = map { "$dir/$_" } grep { /gfs./ } readdir($dh);
my $num_gfs = @files_gfs;
Run Code Online (Sandbox Code Playgroud)
这里map构建了每个文件的完整路径.如果您不需要路径丢弃map { }.请注意,通常不需要在数组上正式使用标量来获取计数,例如
my $num_gfs = scalar @files_gfs; # no need for "scalar" here!
Run Code Online (Sandbox Code Playgroud)
简单地将数组分配给标量,这是一个习惯用语(至少可以说).
如果您在阅读时处理文件,请随时计算
my $cnt_gfs = 0;
while (my $filename = readdir($dh)) {
$cnt_gfs++ if $filename =~ /gfs./;
# Process $dir/$filename as needed
}
Run Code Online (Sandbox Code Playgroud)
这readdir是在标量上下文中(因为它的输出被分配给标量),它遍历目录条目,一次返回一个.
您在中有文件列表@FILES。因此,您的问题变为“如何获取数组的长度?” 这很简单,您只需在标量上下文中评估数组即可。
my $number_of_files = @FILES;
print $number_of_files;
Run Code Online (Sandbox Code Playgroud)
或者,您可以使用scalar()函数消除不必要的标量变量。
print scalar @FILES;
Run Code Online (Sandbox Code Playgroud)