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";
In 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
во многих различных проектах.