2

我习惯于使用$selffor 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 of "One-argument blesses":

One-argument "bless" used at line 162, column 12.  See page 365 of PBP.  Severity: 5

有没有一种简洁的方式来命名我的祝福,但仍然包含我的所有内容script.pl

4

2 回答 2

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
于 2014-02-05T10:09:09.770 回答
4

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

请参阅perlcritic 文档

于 2014-02-05T10:03:05.127 回答