我对下面的情况感到困惑,我应该得到Size = 3
而不是5
因为我的文件夹中只有3个文件? .
和..
来自哪里?
代码:
my $directory = 'c:\modules\SFTP\New';
opendir(DIR,$directory);
my @files = readdir(DIR);
closedir(DIR);
foreach(@files){
print $_,"\n";
}
my $size = @files;
print "Size - $size\n";
运行perl:
在我的文件夹中只有3个文件,但它在CMD中打印出5条记录。为什么cmd中会显示.
和..
?
更新
谢谢minitech和chilemagic。所以.
和..
是当前目录和父目录。
其他问题:如何仅显示文件,以便我可以获得size = 3
。如果没有别的办法,也许我应该以人工的方式来扣除它。
答案 0 :(得分:2)
.
和..
分别是对当前目录和父目录的引用。
从readdir
调用过滤出来是一个相当标准的事情:
use strict;
use warnings;
use autodie;
my $directory = 'c:\modules\SFTP\New';
my @files = do {
opendir my $dh, "$directory";
grep {! /^\.+$/} readdir($dh);
};
如果您对完整路径信息感到满意,也可以使用glob
,其中不包括.
和..
。
my @files = glob("$directory\\*")
答案 1 :(得分:2)
你可以考虑过滤掉那些。当我从readdir
收集文件/目录列表到数组时,我经常使用这样的方法
my @dir_contents = grep { !/^[.]+$/ } readdir($directory);
编辑以接听您的修改
如果只需要文件,可以在perl中使用`-f`测试。所以,也许循环遍历你的目录结构,跳过'。'和'..'以及任何目录,捕获数组中的其余部分:
use warnings;
use strict;
my $directory = 'c:\modules\SFTP\New';
my @files;
opendir( my $dir_handle, $dir );
while (my $file = readdir($dir_handle) ) {
next if $file =~ /^[.]+$/;
push( @files, $file ) if ( -f $file );
}
my $size = @files;
print "Size - $size\n";
答案 2 :(得分:1)
Path::Tiny比readdir好得多,甚至autodie
为你
#!/usr/bin/perl --
use strict; use warnings;
use Path::Tiny qw/ tempdir path /;
my $dad = tempdir;
path( $dad, 'roy' )->touchpath->spew('first');
path( $dad, 'g' )->spew('second');
path( $dad, 'biv' )->spew('third');
print "$_\n" for $dad->children;
$dad->remove_tree;
print "$_\n" for $dad->children;
__END__
$ perl path-tiny-children-three.pl
C:/...Temp/q1gU2kX7kZ/biv
C:/...Temp/q1gU2kX7kZ/g
C:/...Temp/q1gU2kX7kZ/roy
Error opendir on 'C:/...Temp/q1gU2kX7kZ': No such file or directory at path-tiny-children-three.pl line 10.
File::Find::Rule比glob更难忘,是Path :: Tiny
的绝佳伴侣#!/usr/bin/perl --
use strict; use warnings;
use File::Find::Rule qw/ find rule /;
use Path::Tiny qw/ tempdir path /;
my $dad = tempdir;
path( $dad, 'roy' )->touchpath->spew('first');
path( $dad, 'g' )->spew('second');
path( $dad, 'biv' )->spew('third');
print "$_\n" for find( file => maxdepth => 1 => in => $dad );
$dad->remove_tree;
__END__
C:/...Temp/2Ho4c_jBQy/biv
C:/...Temp/2Ho4c_jBQy/g
C:/...Temp/2Ho4c_jBQy/roy