perl在脚本和PerlCritic中使用bless self

perl在脚本和PerlCritic中使用bless self,perl,oop,perl-critic,bless,Perl,Oop,Perl Critic,Bless,我习惯于在OO Perl中使用$self,即使我只是编写自包含的脚本,根本没有命名我的包。例如,我的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 <

我习惯于在OO Perl中使用
$self
,即使我只是编写自包含的脚本,根本没有命名我的包。例如,我的
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'};
}
[...]

是否有一种命名my bless的干净方法,但仍然将所有内容都包含在my
script.pl
中?

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


请参阅。

并非所有被perlcritic批评的问题都必须解决。但通常,最好指定
bless
的包名

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

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
使用Moo;
有_time_stamp=>(is=>'rw');
子时间戳{
我的($self,@args)=;
if(1\u时间戳(strftime“%Y%m%d\u%H%m%S”,@args);
}
返回$self->\u时间戳;
}
我的$self=\uuuuuuu软件包\uuuuuuu->new;#自动生成一个“新”

必须将变量添加到类/包中(第二个参数)。您希望将其放入哪个包中?
perldoc-f bless
:“如果省略了CLASSNAME,则使用当前包。”我尝试了您的包解决方案,效果很好。我想现在这对我来说已经足够了。在perlcritic没有一张干净的床单真的很烦人,我真的想从严厉到严厉再到残忍再到残忍!将祝福带入
main::
,似乎在道德上是错误的
perl-MData::Dumper-we'sub-foo{\@}打印Dumper-bless({1,2})->foo(7)
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