如何在perl中使用循环
我在perl中有一个子模块来比较文件的时间。 现在,我将不仅比较目录A中的“lin”和目录B中的“LINT”。如何在A和B中添加更多文件如何在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"
...
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),对不起。