Для обработки параметров командной строки, посмотрите на Getopt :: Long . Вы получаете все возможные варианты разбора аргументов.
Существует множество модулей, которые обрабатывают ведение журнала. Log4Perl - очень популярный модуль регистрации.
Если вы действительно, действительно хотите ограничить себя, избегая CPAN (что является плохой идеей), вы можете довольно легко взломать модуль регистрации.
Вот маленький, который я взломал для тебя. Нужны тесты, реальные документы и так далее. Я также использовал некоторые продвинутые методы, такие как пользовательский метод import()
. Есть также некоторые ошибки, связанные с моим использованием одной переменной для хранения настроек DEBUG для всего приложения. Но это работает. Я использовал подобный модуль в проекте и был очень доволен им.
package QLOG;
use strict;
use warnings;
use Carp qw(croak);
our %DEBUG_OPTIONS;
our %VALID_DEBUG_OPTIONS;
our %DEBUG_CONFLICTS;
sub import {
my $pkg = shift;
my $target = caller();
my %opts = @_;
# Configure options
croak "Must supply an array ref of valid modes"
unless exists $opts{options};
@VALID_DEBUG_OPTIONS{ @{$opts{options}} } = ();
# Configure conflicts
if( exists $opts{conflicts} ) {
@DEBUG_CONFLICTS{ keys %{$opts{conflicts}} }
= values %{$opts{conflicts}}
}
# Export DEBUG method
{ no strict 'refs';
*{$target.'::DEBUG'} = \&DEBUG;
}
return;
}
sub DEBUG {
my $mode = shift;
croak "DEBUG mode undefined"
unless defined $mode;
return unless
( $mode eq 'ANY' and %DEBUG_OPTIONS )
or exists $DEBUG_OPTIONS{$mode};
warn "$_\n" for @_;
return 1;
}
sub set_options {
for my $opt ( @_ ) {
die "Illegal option '$opt'"
unless exists $VALID_DEBUG_OPTIONS{$opt};
$DEBUG_OPTIONS{$opt}++;
}
return;
}
sub check_option_conflicts {
for my $opt ( keys %DEBUG_OPTIONS ) {
if (exists $DEBUG_CONFLICTS{$opt}) {
for ( @{$DEBUG_CONFLICTS{$opt}} ) {
die "Debug option $opt conflicts with $_"
if exists $DEBUG_OPTIONS{$_}
}
}
}
return;
}
1;
А затем используйте это так:
#!/usr/bin/perl
use strict;
use warnings;
use Getopt::Long;
use QLOG
options => [qw(
VERBOSE
SUPPRESS_ERROR_MSGS
IGNORE_VALIDATION
SETPPING_COMPUTATION
)],
conflicts => {
VERBOSE => [qw(
SUPPRESS_ERROR_MSGS
SETPPING_COMPUTATION
)],
};
process_args();
DEBUG VERBOSE => 'Command line data parsed.';
main();
### ---------------
sub main {
DEBUG VERBOSE => 'BEGIN main()';
if( DEBUG 'ANY' ) {
print "debug_mode is ON\n";
}
else {
print "debug_mode is OFF\n";
}
warn "Error which could be surpressed\n"
unless DEBUG 'SUPPRESS_ERROR_MSGS';
}
# Get arguments and process flags like 'v' and 'sc' into strings specified
# in QLOG configuration above.
# This processing makes the nice DEBUG VERBOSE => 'blah'; syntax work.
sub process_args {
# Use Getopt::Long to parse @ARGV
my @debug_options;
GetOptions (
'debug-options=s@' => \@debug_options,
'help' => \&usage,
) or usage();
# Convert option flags to strings.
my %option_lut = qw(
v VERBOSE
s SUPPRESS_ERROR_MSGS
i IGNORE_VALIDATION
c SETPPING_COMPUTATION
);
my @options = map { # This chained map
exists $option_lut{$_} # looks in the lut for a flag
? $option_lut{$_} # translates it if found
: $_ # or passes on the original if not.
}
map { # Here we split 'cv' into ('c','v')
split //
} @debug_options;
# Really should use Try::Tiny here.
eval {
# Send a list of strings to QLOG
# QLOG will make sure they are allowed.
QLOG::set_options( @options );
QLOG::check_option_conflicts();
1; # Ensure true value returned if no exception occurs.
} or usage($@);
return;
}
sub usage {
my $message = shift || '';
$message = '' if $message eq 'help';
print <<"END";
$message
Use this proggy right.
END
exit;
}
Возможно, вы захотите добавить метод, чтобы сделать ваши сообщения отладки подавляемыми.
Что-то вроде:
sub SUPPRESSED_BY {
my $mode = shift;
return if exists $DEBUG_OPTIONS{$mode);
return @_;
}
Экспортируйте символ, а затем используйте его следующим образом:
DEBUG VERBOSE => SUPPRESSED_BY SUPPRESS_ERRORS => 'My message here';
Простота, с которой модуль регистрации может быть объединен, привела к тому, что стало доступно большое количество таких модулей. Существует так много способов выполнить эту задачу и различные варианты требований при использовании кода, что их даже больше. Я даже написал несколько модулей регистрации для удовлетворения различных потребностей.
Во всяком случае, это должно дать вам серьезное погружение в воду, когда вы погружаетесь головой в Perl.
Не стесняйтесь спрашивать меня: "Какого черта?" Тип вопросов. Я понимаю, что много кидаю в тебя.