该文件夹显示3个文件但在CMD中运行脚本时显示额外的`。 `和`..`?

时间:2014-07-25 01:22:50

标签: perl

我对下面的情况感到困惑,我应该得到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:

It shows 5 records instead of 3

在我的文件夹中只有3个文件,但它在CMD中打印出5条记录。为什么cmd中会显示...

enter image description here

更新

谢谢minitech和chilemagic。所以...是当前目录和父目录。

其他问题:如何仅显示文件,以便我可以获得size = 3。如果没有别的办法,也许我应该以人工的方式来扣除它。

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