朋友我有这个代码从目录中读取文件名并打印这些名称
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
迷惑前两行是什么?
提前谢谢
答案 0 :(得分:2)
更简单的替代方法是使用glob
函数:
my @default_files = glob 'defaults/*';
或者:
my @default_files = <defaults/*>;
这些函数过滤掉以.
开头的文件和目录条目,就像shell一样。
答案 1 :(得分: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";
}
答案 2 :(得分:0)
“”。表示当前工作目录,“..”表示当前工作目录的父目录
答案 3 :(得分: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);