我习惯使用$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
中的所有内容?
答案 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
标记来禁用对该特定行的批评。