Win32 Perl - 通过传递目录参数区分文件和文件夹的方法

4
我正在使用perl strawberry编写脚本。首先,它需要能够接收路径参数并获取该路径的目录列表,并且需要能够区分文件和文件夹。我阅读了一些相关教程并编写了下面的脚本,但只有当我给出脚本当前所在的路径时才有效。如果我给出其他路径,则-f和-d测试无法正常工作。
编辑:澄清一下,如果我给它一个不同于自己路径的路径,则脚本确实会将所有文件和文件夹放入@thefiles中,只是-f和-d测试无法正常工作。
use Getopt::Long;

my $dir;

GetOptions('-d=s' => \$dir);

opendir(DIR, $dir) or die "BORKED";
@thefiles = readdir(DIR);
print DIR;
closedir(DIR);

@filez;
@dirz;

foreach $file (@thefiles){
 if (-f$file){
  push(@filez, $file);
 }
 if (-d$file){
  push(@dirz, $file);
 }
}

print "files: @filez \n";
print "Directories: @dirz \n";

这里有一张截图:http://i.stack.imgur.com/RMmFz.jpg,希望有人能够帮忙,非常感谢您的时间。 :)
2个回答

1

马丁·克莱顿告诉你代码不起作用的原因。

这里有一种使用map和一些更现代的Perl结构来修复它的方法:

use strict; 
use warnings; 
use Getopt::Long; 

my $dir; 

GetOptions('-d=s' => \$dir); 

opendir my $dh, $dir or die "BORKED: $!";
my @thefiles = map { "$dir/$_" } readdir $dh;
closedir $dh;

my @filez; 
my @dirz; 

for my $file (@thefiles) { 
    push @filez, $file if -f $file;
    push @dirz , $file if -d $file;
} 

print "files: @filez \n"; 
print "Directories: @dirz \n"; 

1
谢谢你,toolic!:D 在我理解所有这些之前,我还需要做几个教程。 - Aaron

1

这是因为文件测试的-f-d操作符会使用相对路径,除非您提供绝对路径。 readdir函数将返回在目录中找到的文件(和子目录...)名称,但不包括完整路径。

来自文档

如果您计划从readdir返回值中进行文件测试,则最好在问题目录前加上目录。否则,由于我们没有更改目录,它将测试错误的文件。


1
非常感谢 :D。对于未来阅读此内容的所有人,解决方案是将这个改为:"if (-f "$dir$file")",而不是 "if (-f $file)"。 - Aaron

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接