Еще один вариант, который еще не был упомянут для повторного использования кода в ваших сценариях, - это поместить общий код в модуль .Если вы поместите общие подпрограммы в модуль или модули, вы можете сделать ваши скрипты короткими и сфокусированными на том, что они делают, что является особенным, в то же время изолируя общий код в удобной форме для повторного использования.
Например,Вот модуль с несколькими подпрограммами.Поместите это в файл с именем MyModule.pm
:
package MyModule;
# Always do this:
use strict;
use warnings;
use IO::Handle; # For OOP filehandle stuff.
use Exporter qw(import); # This lets us export subroutines to other scripts.
# These may be exported.
our @EXPORT_OK = qw( gather_data_from_fh open_data_file );
# Automatically export everything allowed.
# Generally best to leave empty, but in some cases it makes
# sense to export a small number of subroutines automatically.
our @EXPORT = @EXPORT_OK;
# Array of directories to search for files.
our @SEARCH_PATH;
# Parse the contents of a IO::Handle object and return structured data
sub gather_data_from_fh {
my $fh = shift;
my %data;
while( my $line = $fh->readline );
# Parse the line
chomp $line;
my ($key, @values) = split $line;
$data{$key} = \@values;
}
return \%data;
}
# Search a list of directories for a file with a matching name.
# Open it and return a handle if found.
# Die otherwise
sub open_data_file {
my $file_name = shift;
for my $path ( @SEARCH_PATH, '.' ) {
my $file_path = "$path/$file_name";
next unless -e $file_path;
open my $fh, '<', $file_path
or die "Error opening '$file_path' - $!\n"
return $fh;
}
die "No matching file found in path\n";
}
1; # Need to have trailing TRUE value at end of module.
Теперь в скрипте A мы берем имя файла для поиска и обработки, а затем печатаем форматированный вывод:
use strict;
use warnings;
use MyModule;
# Configure which directories to search
@MyModule::SEARCH_PATH = qw( /foo/foo/rah /bar/bar/bar /eeenie/meenie/mynie/moe );
#get file name from args.
my $name = shift;
my $fh = open_data_file($name);
my $data = gather_data_from_fh($fh);
for my $key ( sort keys %$data ) {
print "$key -> ", join ', ', @{$data->{$key}};
print "\n";
}
Скрипт Bищет файл, анализирует его и затем записывает проанализированную структуру данных в файл YAML.
use strict;
use warnings;
use MyModule;
use YAML qw( DumpFile );
# Configure which directories to search
@MyModule::SEARCH_PATH = qw( /da/da/da/dum /tutti/frutti/unruly /cheese/burger );
#get file names from args.
my $infile = shift;
my $outfile = shift;
my $fh = open_data_file($infile);
my $data = gather_data_from_fh($fh);
DumpFile( $outfile, $data );
Некоторая связанная документация:
- perlmod -О модулях Perl в целом
- perlmodstyle - Руководство по стилю модулей Perl;здесь есть очень полезная информация.
- perlnewmod - запуск нового модуля
- Exporter - модуль, используемый для экспорта функций в примере кода
- use - статья о perlfunc в
use
.
В некоторых из этих документов предполагается, что вы будете делиться своим кодом на CPAN.Если вы не будете публиковать в CPAN, просто проигнорируйте части о регистрации и загрузке кода.
Даже если вы не пишете для CPAN, для разработки модулей полезно использовать стандартные инструменты и файловую структуру CPAN.Следование стандарту позволяет использовать все инструменты, используемые авторами CPAN, для упрощения процесса разработки, тестирования и установки.
Я знаю, что все это кажется действительно сложным, но стандартные инструменты облегчают каждый шаг.Даже добавление модульных тестов в ваш дистрибутив модуля легко благодаря отличным инструментам.Окупаемость огромна и стоит потраченного времени.