perl使用脚本和PerlCritic中的祝福自我

时间:2014-02-05 09:53:17

标签: perl oop perl-critic bless

我习惯使用$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 个答案:

答案 0 :(得分:7)

并非由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

答案 1 :(得分:4)

您可以创建自己的Perl Critic策略并配置批评者使用它而不是默认值。 Perl::Critic::Policy::ClassHierarchies::ProhibitOneArgBless是您要禁用的规则。但是,如果您在大多数情况下需要该规则,则可以在源中使用##no critic标记来禁用对该特定行的批评。

请参阅perlcritic documentation