perl在脚本和PerlCritic中使用bless self
我习惯于在OO Perl中使用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 <
$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