如何在perl中使用循环

如何在perl中使用循环,perl,loops,Perl,Loops,我在perl中有一个子模块来比较文件的时间。 现在,我将不仅比较目录A中的“lin”和目录B中的“LINT”。如何在A和B中添加更多文件 ... sub find_newer_files { my ( $dirA, $extA, $dirB, $extB ) = @_; ..... find_newer_files( 'D:/projects/Check_Tool/AGF/lux/2016_12' => "lin"

我在perl中有一个子模块来比较文件的时间。 现在,我将不仅比较目录A中的“lin”和目录B中的“LINT”。如何在A和B中添加更多文件

...    
sub find_newer_files {
        my ( $dirA, $extA, $dirB, $extB ) = @_;
    .....
    find_newer_files(
        'D:/projects/Check_Tool/AGF/lux/2016_12' => "lin",  # directory_A => extension_A
        'D:/projects/Check_Tool/TAGF/lux' => "LINT", # directory B
    );
...

更新 是的,这是我需要的。因此,我可以像您那样在数组中添加更多扩展

我的子程序的其余部分是:

sub find_newer_files {
    my ( $dirA, $extA, $dirB, $extB ) = @_;

    # read files and their mtime from dirA into a hash (fname => mtime)
    chdir $dirA or die "chdir($dirA) failed: $!";
    my %files_in_A = map { $_ => ( stat $_ )[9] } glob( "*.$extA" );

    # read files and their mtime from dirB into a hash (fname => mtime)
    chdir $dirB or die "chdir($dirB) failed: $!";
    my %files_in_B = map { $_ => ( stat $_ )[9] } glob( "*.$extB" );

    # for each found file in dirA
    for my $fileA ( keys %files_in_A ) {

        # replace extension for wanted file in dirB
        ( my $fileB = $fileA ) =~ s{\.\Q$extA\E$}{.$extB};

        warn "$fileA -> $fileB\n" if $ENV{DEBUG};

        # if we found a fileB in dirB
        if ( exists $files_in_B{$fileB} ) {

            # compare the timestamp; tell us when fileB is older than fileA
            if ( $files_in_A{$fileA} > $files_in_B{$fileB} ) {
                say "$fileB is older than $fileA";    #say
            }
        }
    }
    

我猜你的意思是:

...    
sub find_newer_files {
        my ( $dirA, $extA, $dirB, $extB ) = @_;
        my @found;
        if (ref $extA) {
            foreach my $i(0 .. $#{$extA}) {
                push @found, 
                    find_newer_files($dirA, $extA->[$i], $dirB, $extB->[$i]);
            }
            return @found;
        }
    .....
    find_newer_files(
        'D:/projects/Check_Tool/AGF/lux/2016_12' => "lin",  # directory_A => extension_A
        'D:/projects/Check_Tool/TAGF/lux' => "LINT", # directory B
    );
    find_newer_files(
        'D:/projects/Check_Tool/AGF/lux/2016_12' => ["lin1","lin2","lin3"],  # directory_A => extension_A
        'D:/projects/Check_Tool/TAGF/lux' => ["LINT1","LINT2","LINT3"], # directory B
    );
...
通过添加此块

        my @found;
        if (ref $extA) {
            foreach my $i(0 .. $#{$extA}) {
                push @found, 
                    find_newer_files($dirA, $extA->[$i], $dirB, $extB->[$i]);
            }
            return @found;
        }
在函数顶部,您可以检查其他扩展名(假设您不返回任何内容或文件列表)

因此,与其写:

find_newer_files(
    'D:/projects/Check_Tool/AGF/lux/2016_12' => "lin1",  # directory_A => extension_A
    'D:/projects/Check_Tool/TAGF/lux' => "LINT1", # directory B
);
find_newer_files(
    'D:/projects/Check_Tool/AGF/lux/2016_12' => "lin2",  # directory_A => extension_A
    'D:/projects/Check_Tool/TAGF/lux' => "LINT2", # directory B
);
find_newer_files(
    'D:/projects/Check_Tool/AGF/lux/2016_12' => "lin3",  # directory_A => extension_A
    'D:/projects/Check_Tool/TAGF/lux' => "LINT3", # directory B
);
你可以用

find_newer_files(
    'D:/projects/Check_Tool/AGF/lux/2016_12' => ["lin1","lin2","lin3"],  # directory_A => extension_A
    'D:/projects/Check_Tool/TAGF/lux' => ["LINT1","LINT2","LINT3"], # directory B
);

你的问题不清楚。您能详细说明一下您到底想做什么吗?在子模块“查找更新的文件”中,我将文件与目录A中的扩展名“lin”和目录B中的扩展名“LINT”进行比较。现在,我将不仅比较“林”(A)和“林特”(B)。我将添加更多的扩展,但仍然不清楚<代码>我将添加更多扩展名你的意思是什么?是否还要比较其他扩展?是的,我也会比较其他扩展。目前,我比较了文件*.lin和*.LINT。除此之外,我将比较*.adl和*.ADLT…好的,那么您遇到了什么问题?“+-typos”请不要发布未经测试的代码。至少你应该确保它是编译的。删除了打字错误。不,你没有。这段代码从未见过编译器。这是一个可怕的答案,它猜测OP可能意味着什么,而没有解释这个猜测,也没有描述“解决方案”是如何工作的以及它假设了什么。它也不可能像现在这样工作。@Borodin:我确实在这里检查过了,但在编辑我的答案时犯了一个错误(实际上是2),对不起。