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.

Другие вопросы по тегам