2014-02-05 48 views
2

我習慣於使用OO Perl使用$self,即使我只是編寫自包含腳本而沒有命名我的軟件包。例如,我的script.pl應該像這樣開頭:perl在腳本和PerlCritic中使用祝福自我

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的評論家:

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

有沒有命名我的祝福的清潔方式,但仍然包含在我的script.pl一切嗎?

+0

你要保佑可變進級/包([祝福](http://perldoc.perl.org/functions/bless.html)第二個參數)。你想保存哪個包? –

+0

'perldoc -f bless':「如果CLASSNAME被省略,則使用當前包。」 –

回答

7

並不是所有批評的東西待修復。但通常,指定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 
+0

我把福音當成福音! :-) – 719016

+0

我試過你的__PACKAGE__解決方案,它工作的很好。我認爲目前這對我會有幫助。這只是煩人的,沒有一張乾淨的牀單,我真的很想從嚴厲到殘酷到殘酷! – 719016

+1

祝福'main ::'在道德上是錯誤的嗎? 'perl -MData :: Dumper -we'sub foo {\ @_} print Dumper bless({1,2}) - > foo(7)'' –

4

您可以創建自己的Perl Critic策略並配置批評者使用該策略而不是默認策略。 Perl::Critic::Policy::ClassHierarchies::ProhibitOneArgBless是您要禁用的規則。但是,如果您在大多數情況下需要該規則,則可以在源代碼中使用##no critic標記以禁用該特定行的批評。

請參閱perlcritic documentation