Perl的.OOP脚本中的重复代码

Car*_*_30 1 oop perl

我正在构建一个脚本,需要一些关于重复代码的帮助.

这是我的构造函数:

sub new {
    my $class = shift;
    my $self = {
                  ip          => shift,
                  username    => shift,
                  password    => shift,
                  need_enable => 0,
                  enable => '',
    };
    my $session = Net::Telnet->new( Timeout => 2, Errmode => 'return');         
    $self->{session} = $session;

   bless($self, $class);
}
Run Code Online (Sandbox Code Playgroud)

以下是一些方法:

sub _send_enable {
    my $self = shift;
    my $session = $self->{session};
    ...

sub _command {
    my $self = shift;
    my $session = $self->{session};
    my $command = shift;
    ...

sub _match_prompt {
    my $self = shift;
    my $session = $self->{session};
    my ( $prematchU , $matchU ) =
         $session->waitfor(match => '/(?m:^[\w.-]+\s?(?:\(config[^\)]*\))?\s?[\$#>]\s?(?:\(enable\))?\s*$)/',
                                        Timeout => 10);
    return  ($prematchU,$matchU);
}
Run Code Online (Sandbox Code Playgroud)

如您所见,在这些方法中,我需要回忆一下在构造函数中初始化的telnet实例.

我有更多的方法,在那些方法中,我需要再次回忆一下telnet实例.

而且,我需要在方法中调用一些方法.我总是需要把对象作为第一个参数:

_command($self, 'show privilege');

_check_enable($self);
Run Code Online (Sandbox Code Playgroud)

可能是我错过了我在"中级Perl"中学到的东西,我觉得我可以避免所有重复的代码.

谢谢你的任何建议!

fri*_*edo 5

首先要做的事情.这个:

_command($self, 'show privilege');

_check_enable($self);
Run Code Online (Sandbox Code Playgroud)

是非常错误的.要在Perl中调用方法,您需要使用

$self->_command( 'show privilege' );
$self->_check_enable();
Run Code Online (Sandbox Code Playgroud)

(在第二行中,您可以省略parens,因为参数列表为空.)

->运营商告诉你要调用的方法,而不是常规的子程序Perl的.如果左侧的东西是受祝福的引用,则使用它的包被用于查找方法.否则,左侧的东西被假定为类名.在任何一种情况下,Perl都将左边的东西作为第一个项放入参数列表中.

->直接使用和调用子例程之间的重要区别在于->语法使Perl查找可能在该类或父类中的方法.直接调用子例程不会通过方法调度程序.

至于访问对象本身,Perl中的标准约定就是这样做

my $self = shift;
Run Code Online (Sandbox Code Playgroud)

但这不是必需的.由于你的方法的参数来自常规@_参数数组,你可以使用$_[0].您也可以使用$_[0]{session}您的会话对象.但恕我直言,如果你将它解压缩到一个命名变量,它更整洁,更容易阅读.

如果你想避免定义所有重复的类型$self,你可以使用像Method :: Signatures这样的东西,它会给你一个为你method解包的花哨的关键字$self.

所以这:

sub _command {
    my $self = shift;
    my $session = $self->{session};
    my $command = shift;
    ...
Run Code Online (Sandbox Code Playgroud)

变成这样:

method _command( $message ) { 
    # $self and $message are already defined, so just use them
    ...
Run Code Online (Sandbox Code Playgroud)