如何忽略Perl的readdir中的单点和双点条目?

时间:2014-01-18 11:17:35

标签: perl file file-io directory

从此处跟进:Perl Imgsize not working in loop? 我有另一个问题 - 当它读取目录中的文件时,我怎么不让perl列出单点和双点条目?

与上面的链接问题一样,我对while循环(while ($file = readdir($dh)))的输出是这样的:

.
..
file1.jpg
file2.jpg 
file3.jpg 
file4.jpg 
file5.jpg 

这会产生问题,因为我在某个地方也有一个计数器,它正在计算我的文件。并且...不算作文件,因此我的计数器在我的目录中提供的文件数量确实超过实际数量。

我将if($file == "." || $file == ".."){ continue;}if ($file ~ /^\./ or $file ~ /^\.\./) {continue;}及其不同的变体添加到while循环的开头...但由于编译错误,我一直在中止。

我们如何获得单点和双点条目?

5 个答案:

答案 0 :(得分:7)

要测试字符串,您必须使用eq

if($file eq "." || $file eq ".."){ next;}

或:

next if $file =~ /^\.\.?$/;

答案 1 :(得分:3)

我会建议别的东西 - 不要使用readdir而是使用glob

my @dirlist = glob ( "$dir/*.jpg" ); 

然后,您将获得与该规范匹配的文件的路径列表。如果您正在执行此操作,此功能特别有用:

foreach my $file ( glob ( "/path/to/file/*.jpg" ) ) {
     open ( my $input, '<', $file ) or die $!;
}

readdir的情况下,您只会获得文件名,并且必须自己重建路径。

答案 2 :(得分:0)

这可行,并跳过前2。和..

@IBAction func nosOffresTapped(sender: AnyObject) {
    let window  = UIApplication.sharedApplication().keyWindow
    let viewController = window!.rootViewController as! ContainerViewController
    let nosOffresViewController: NosOffresViewController = UIStoryboard.nosOffresViewController()!
    nosOffresViewController.delegate = viewController

    self.delegate?.pushViewControllerInStack!(nosOffresViewController)
    self.navigationController?.pushViewController(nosOffresViewController, animated: false)

}

答案 3 :(得分:0)

我已经找到了另一个解决方案,它可以删除子文件夹中的所有文件 - 不是从第一个文件(0)开始,而只是从第三个文件(2)开始:

#!/bin/perl
@AllFiles = ();
opendir(DIRECTORY, "temp");
@AllFiles = readdir(DIRECTORY);
closedir DIRECTORY;
print $#AllFiles-1  ."\n";                   #Show 3 for three files, as it shows number of last file: 0=. 1=.. 2=aaa.txt 3=bbb.xml 4=ccc.pdf
$FileNumber = 2;                             #Starting with file 2, don't need to try deleting current and parent folders
until($FileNumber > $#AllFiles ) {
    unlink ("temp/" . $AllFiles[$FileNumber]);
    print $FileNumber-1 . ": temp/" . $AllFiles[$FileNumber] . "\n";       #show file numbers as 1=aaa.txt 2=bbb.xml 3=ccc.pdf
    $FileNumber += 1;
}

答案 4 :(得分:0)

如果您在列表上下文中获取目录内容,则可以使用grep过滤掉dotfiles:

opendir (my $dh, $src) || die "Can't opendir $src: $!\n";
my @entries = grep {!/^\./} readdir($dh);
closedir ($dh);