我正在构建一个脚本,需要一些关于重复代码的帮助.
这是我的构造函数:
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"中学到的东西,我觉得我可以避免所有重复的代码.
谢谢你的任何建议!
首先要做的事情.这个:
_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)
归档时间: |
|
查看次数: |
127 次 |
最近记录: |