-1

朋友们,我有这段代码,它从目录中读取文件名并打印这些名称

opendir DIR1,  "defaults" or die "cannot open dir: $!";#open the given dir
        my @default_files=readdir DIR1;
        foreach my $fls(@default_files){ 
                        chomp($fls); 
                        print "$fls\n";
           }

当我运行上面的代码时,我得到了

.
..
PGR.csv
report.csv
std_headers.csv
tab_name.txt

'我很困惑什么是前两行?提前致谢

4

4 回答 4

2

一个更简单的替代方法是使用该glob函数:

my @default_files = glob 'defaults/*';

或者:

my @default_files = <defaults/*>;

这些函数过滤掉以 开头的文件和目录条目,.就像 shell 一样。

于 2013-03-24T11:34:04.683 回答
1

第一行是:

  • .链接到您当前正在访问的目录。

  • ..链接到您正在访问的目录(父目录)上方的目录。

编辑:

过滤掉两个命名条目的一种可能性是使用grep

opendir DIR1, "tmp" or die "cannot open dir: $!";
my @default_files= grep { ! /^\.\.?$/ } readdir  DIR1;

foreach my $fls (@default_files) { 
   chomp($fls); 
   print "$fls\n";
}
于 2013-03-24T11:23:24.250 回答
0

“。” 表示当前工作目录,“..”表示当前工作目录的父目录

于 2013-03-24T11:24:46.610 回答
0

在目录列表中,.代表Working Directory..代表Parent Directory

在标量上下文中,您可以通过显式检查这些条目来跳过它们:

while (defined(my $next = readdir $dir)) {
    next if $next =~ /\A[.][.]?\z/;
    # ...
}

或在列表上下文中:

my @entries = grep !/\A[.][.]?\z/, readdir $dir;

如果我已经在使用File::Slurp,我更喜欢只使用read_dir它提供的功能。除了将目录路径添加到每个返回的条目之外,.以下内容将自动跳过:..

 my @paths = read_dir('/path/to/dir', prefix => 1);
于 2013-03-24T13:32:02.350 回答