2016-04-13 9 views
-1

コマンドを実行し、正規表現に基づいて出力を解析し、statusとipという2つの値を返す関数を作成しました。関数呼び出しは、期待どおりに両方の値を返します。スカラーを返す代わりに、私はハッシュ・リファレンスを返したい。いくつかの人が、以下の関数のハッシュリファレンスを返す方法を教えてくれますか?perlの関数からハッシュリファレンスを返します

sub status { 
    my ($self,$int) = @_; 
    my $status = 0; 
    my $ip = 0; 

    my $cmd  = 'cisco ios command ' . $interface; 

    my $out = $self->{sshObj}->exec($cmd); 

    foreach my $line ( $out) { 
     if ($line =~ m/Session\s+status:\s+(.*)/) { 
      $status = $1; 
     } 
     if ($line =~ /(\d+.\d+.\d+.\d+)/) { 
      $ip = $1; 
     } 
    } 

    return ($status,$ip); 
} 

関数コール:私は上記のコメントで述べた私の不安は別に

my ($status, $ip) = 
      $self->{'$tunnel_obj'}->status($self->{'outer_t_1'}); 

    INFO ("status : $status"); 
    INFO ("ip : $ip"); 


Output : 
status : UP 
ip : 172.10.78.33 
+0

だろう

sub status { my ($self, $int) = @_; my $out = $self->{sshObj}->exec("cisco ios command $interface"); my %ret; for ($out) { $ret{status} = $1 if /Session\s+status:\s+(.*\S)/; $ret{ip} = $1 if /(\d+.\d+.\d+.\d+)/; } \%ret; } 

を扱っているモジュール言う場合にのみ、私はそれを修正することができます!私は機能コードだけを残し、スカラーをハッシュに変換する関数を追加します。私はそれが答えではないことを知っていますが、それはあなたの作業コードをそのまま維持します。 – Sparky256

+1

@ Sparky256複数の値を返す場合は、スカラーを使うのは良い考えではないと思います。私は、ハッシュrefは良い選択だろうと思う。 – nims

+0

これはあなたの本当のコードですか? '$ self'とは何ですか?そして特に、 '$ out'とは何ですか?あなたのループ 'foreach my $ line($ out)'はちょうど1回実行されるので、ループは必要ありません。それはあなたの期待ですか? – Borodin

答えて

3

、私は本質的要素で$status$ipを交換している

変更するには、以下のコードを使用しますハッシュ%retを返し、そのハッシュへの参照を返します。

しかし、私は再びtと言わなければなりません帽子forループは一度だけ実行され、このコードは間違っていますです。あなたはあなたの関数呼び出しは、それが動作する場合、それを修正しないでください

my $ret = $self->{$tunnel_obj}->status($self->{outer_t_1}); 

INFO("Status: $ret->{status}"); 
INFO("IP:  $ret->{ip})"); 
+0

私は職場で作成した内部ライブラリを使用しています。 {sshObj} - > exec()、exec()は、私たちの組織の内部フレームワークの一部である関数です。あなたの答えは完璧で、期待どおりに動作します。 – nims

関連する問題