【问题标题】:Perl - Recursively Examining Directory TreePerl - 递归检查目录树
【发布时间】:2013-12-06 01:45:55
【问题描述】:

我的脚本应该递归地检查所有包含的目录和文件的当前目录。然后应该输出每个文件和最后修改的日期。

它似乎适用于当前目录中的某些目录,但不适用于其他目录。我得到了不正确的结果,不知道我的逻辑在哪里失败。

#!/usr/bin/perl -w
use Cwd;
use Time::Piece;

my $startdir = &cwd;
my @files;

sub treeExamine() {


    my $workdir = shift;
    chdir($workdir) or die "Can't change directory\n";
    opendir(DIR,".") or die "Can't open directory\n";
    my @names = readdir(DIR) or die "Can't read directory\n";
    closedir(DIR);

    foreach my $name(@names) {

        next if($name eq ".");
        next if($name eq "..");
        if(-f $name) {
            my $dmod = (stat $name)[9];
            my($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime($dmod);

            $day = substr('0'.$mday,-2);
            $month = substr('0'.($mon+1),-2);
            $year = substr($year+1900,-2);

            push (@files, "$name\t Modified on : $day/$month/$year\n");
        }
        else {
            print "not file $name\n";
        }
        if(-d $name) {
            &treeExamine($name);
            next;
        }

        chdir($startdir) or die "Unable to change to directory $startdir \n";
    }

}

&treeExamine(".");
print @files;

【问题讨论】:

  • 不要在子名称后使用空括号,这是一个原型,您很可能不想使用这些。在这种情况下,它会强制您在子例程调用中使用& 符号来覆盖原型。此外,您正在尝试重新发明轮子:File::Find 将允许您递归遍历目录。

标签: perl recursion directory


【解决方案1】:

对于递归遍历目录树,您应该使用File::Find。它是 Perl 5 中的核心模块。此外,您可以使用 Time::Piece 跳过您笨拙的日期操作。

use strict;
use warnings;
use Time::Piece;
use File::Find;

find(\&wanted, ".");

sub wanted {
    return if -d;
    my $dmod = (stat $_)[9];
    my $t = localtime($dmod);
    print "$File::Find::name\t Modified on : ", $t->dmy("/"), "\n"; 
}

此代码将(我假设)执行您希望代码执行的操作,即扫描当前目录"." 中的目录并打印所有文件的修改日期。预定义函数dmy 在两位数年份中不可用,但是,如果不需要,为什么要创建 Y2K 错误?想象一下日期11th Nov 2011

另外,正如我在 cmets 中提到的,您不应该使用 prototypes。它们是可选的,它们的目的是为子例程提供额外的功能,以模拟内置命令的某些行为(例如 mapgrep 采用不带 sub 关键字的代码括号,或popshift 等采用数组而不将其扩展到其元素中)。你的子声明应该是

sub treeExamine {

没有别的了。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-09-30
    • 1970-01-01
    • 1970-01-01
    • 2011-07-28
    • 2016-07-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多