justintime находится на правильном пути, когда он отмечает повторение и пытается его устранить. Я сделал шаг на шаг дальше, чем он.
Вместо того, чтобы инкапсулировать только часть копирования/перемещения кода, имеет смысл удалить все повторение путем инкапсуляции итерации списка.
Я поместил подпрограмму в модуль, чтобы впоследствии ее можно было использовать повторно. Это также уменьшает повторяющийся код.
use SearchMove;
my $found = search_and_move(
src => 'Parser.exe',
dest => 'Parser.exe',
dirs => [
"bin/Debug",
"bin/Release",
],
);
die "Can't find the Parser.exe\n"
unless defined $found;
print "Found Parser.exe in $found";
В SearchMove.pm
пакет SearchMove;
использование строгое; использовать предупреждения;
use Exporter 'import';
our @EXPORT_OK = qw(search_and_move);
our @EXPORT = @EXPORT_OK;
sub search_and_move {
my %arg = @_;
croak "No source file" unless exists $args{src};
croak "No dest file" unless exists $args{dest};
croak "No search paths" unless exists $args{dirs};
my $got_file;
for my $dir (@{$arg{dirs}}) {
my $source = "$dir/$arg{src}";
if(-e $source) {
move($source, $arg{dest});
$got_file = $dir;
last;
}
}
return $got_file;
}
1;
Теперь вы можете использовать search_and_move
во многих проектах.
жуткий, эти ответы почти одинаковы. – kenny