首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >perl在脚本和PerlCritic中使用bless

perl在脚本和PerlCritic中使用bless
EN

Stack Overflow用户
提问于 2014-02-05 09:53:16
回答 2查看 343关注 0票数 2

我习惯于在OO中使用$self,即使我只是编写自带的脚本,而根本没有命名我的包。例如,我的script.pl应该这样开头:

代码语言:javascript
复制
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对“单参数祝福”的批评相悖:

代码语言:javascript
复制
One-argument "bless" used at line 162, column 12.  See page 365 of PBP.  Severity: 5

是否有一种清洁的方式来命名我的祝福,但仍然包含在我的script.pl中。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-02-05 10:09:09

不是所有被评审团批评的东西都必须固定下来。但是通常情况下,最好指定bless的包名。

如果不声明包名,则代码隐式地在package main中。如果您不关心实际名称,并且希望引用当前包,请使用__PACKAGE__符号,例如:

代码语言:javascript
复制
my $self = bless {} => __PACKAGE__;

你也可以写一点样板:

代码语言:javascript
复制
sub new {
  my ($class) = @_;
  return bless {} => $class;
}

my $self = __PACKAGE__->new;

或者您可以使用像Moo这样的对象系统

代码语言:javascript
复制
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
票数 7
EN

Stack Overflow用户

发布于 2014-02-05 10:03:05

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

审稿文献

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21573801

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档