Моя цель состоит в том, чтобы рекурсивно иметь несколько поисков определенных файлов. Поэтому у меня есть эти файлы:Проблемы с вызовами функций для процедуры поиска
/dir/here/tmp1/recursive/foo2013.log
/dir/here/tmp1/recursive/foo2014.log
/dir/here/tmp2/recursive/foo2013.log
/dir/here/tmp2/recursive/foo2014.log
, где в 2013 и 2014 годах говорится, в каком году файлы были изменены.
Я хочу найти более актуальные файлы (foo2014.log
) для каждого дерева каталогов (tmp1
и tmp2
аналогичным образом).
Ссылаясь на this answer У меня есть следующий код в script.pl:
#!/usr/bin/perl
use strict;
use warnings;
use File::Find;
func("tmp1");
print "===\n";
func("tmp2");
sub func{
my $varName = shift;
my %times;
find(\&upToDateFiles, "/dir/here");
for my $dir (keys %times) {
if ($times{$dir}{file} =~ m{$varName}){
print $times{$dir}{file}, "\n";
# do stuff here
}
}
sub upToDateFiles {
return unless (-f && /^foo/);
my $mod = -M $_;
if (!defined($times{$File::Find::dir})
or $mod < $times{$File::Find::dir}{mod})
{
$times{$File::Find::dir}{mod} = $mod;
$times{$File::Find::dir}{file} = $File::Find::name;
}
}
}
, который даст мне этот выход:
Variable "%times" will not stay shared at ./script.pl line 25.
/dir/here/tmp1/recursive/foo2014.log
===
У меня есть три вопроса:
Почему не второй вызов функции
func
работает как первый? Переменные определяются только в рамках функции, поэтому почему я получаю помехи?Почему я получаю уведомление по переменной
%times
и как я могу избавиться от него?Если я определяю функцию
upToDateFiles
внеfunc
я получаю эту ошибку:Execution of ./script.pl aborted due to compilation errors.
Я думаю, это потому, что переменные не определены внеfunc
. Возможно ли это изменить и получить желаемый результат?
Вы можете вместо 'sub upToDateFiles {...' использовать 'my $ upToDateFiles = sub {...', определить перед вызовом find и использовать его как 'find ($ upToDateFiles, ...'. – Qtax
@Qtax Thx, это работает как прелесть! Я был бы рад, если бы вы могли подробно объяснить/объяснить и предложить ответ. Я мог бы также увеличить его тогда :) – EverythingRightPlace