Perl, использующий Bless Self в скрипте и PerlCritic
Я привык к использованию $self
для OO Perl, даже когда я просто пишу автономные скрипты, не называя мой пакет вообще. Например, мой script.pl
началось бы так:
use strict;
use warnings;
my $self = bless {};
$self->time_stamp(localtime(time()));
1;
sub time_stamp {
my ($self,@args) = @_;
# Getter/setter
my $ftime_stamp;
if( 1 < scalar @args ) {
$ftime_stamp = strftime "%Y%m%d_%H%M%S", @args;
$self->{'time_stamp'} = $ftime_stamp;
}
return $self->{'time_stamp'};
}
[...]
Эти сценарии иногда превращаются в надлежащие модули, но иногда я просто позволяю им быть таковыми.
Хотя это идет вразрез с Perl Critic из "Благословения с одним аргументом"
One-argument "bless" used at line 162, column 12. See page 365 of PBP. Severity: 5
Есть ли чистый способ назвать мое благословение, но все еще содержит все, что содержится в моем script.pl
?
2 ответа
Не все, что критикуется perlcritic , должно быть исправлено. Но обычно, действительно, предпочтительно указывать имя пакета для bless
,
Если вы не объявляете имя пакета, ваш код неявно находится в package main
, Если вас не интересует фактическое имя и вы хотите обратиться к текущему пакету, используйте __PACKAGE__
символ, например:
my $self = bless {} => __PACKAGE__;
Вы могли бы также написать небольшой пример:
sub new {
my ($class) = @_;
return bless {} => $class;
}
my $self = __PACKAGE__->new;
Или вы можете использовать объектную систему, как Moo
:
use Moo;
has _time_stamp => (is => 'rw');
sub time_stamp {
my ($self, @args) = @_;
if( 1 < scalar @args ) {
$self->_time_stamp(strftime "%Y%m%d_%H%M%S", @args);
}
return $self->_time_stamp;
}
my $self = __PACKAGE__->new; # a "new" is autogenerated
Вы можете создать свою собственную политику Perl Critic и настроить критика, чтобы использовать ее вместо значения по умолчанию. Perl::Critic::Policy::ClassHierarchies::ProhibitOneArgBless
это правило, которое вы хотите отключить. Если вы хотите использовать это правило в большинстве случаев, вы можете использовать ##no critic
маркер в вашем источнике, чтобы отключить критику для этой конкретной строки.
Смотрите документацию perlcritic.