2016-04-13 5 views
-1

Bir komutu yürüten, ifadeyi normal ifadeye göre ayrıştıran ve iki değer, durum ve ip döndüren bir işlev yazdım. İşlev çağrısı, değerleri beklendiği gibi döndürür. Bir skaler döndürmek yerine, hash ref dönmek istiyorum. Birisi bana aşağıdaki işlevi için nasıl bir ref ref dönüşü yapacağını söyleyebilir mi?dönüş hash ref işlevindeki bir işlevden döndürme

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); 
} 

işlev çağrısı: Yukarıda bir açıklama açıklanan benim şüphelerine Apart

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

olacağını size

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; } 

ilgileniyor modülleri ne olduğunu söylemek sadece doğru yapabilir! Fonksiyonel kodu tek başına bırakıp skaler'i hash'a çevirmek için bir fonksiyon ekleyeceğim. Bunun bir cevap olmadığını biliyorum, ancak çalışma kodunuzu sağlam tutuyor. – Sparky256

+1

@ Sparky256 Birden çok değer döndürmek istiyorsam, skaler kullanmak için iyi bir fikir olduğunu düşünmüyorum. Sanırım hash ref iyi bir seçenek olurdu. – nims

+0

Bu senin gerçek kodun mu? '$ Self' nedir? Ve özellikle, 'out' nedir? Döngünümün $ satırını ($ out) 'tam olarak bir kez yürütecek, böylece döngü gerekmiyor. Beklediğin bu mu? – Borodin

cevap

3

, ben aslında elemanları ile $status ve $ip yerine edilmektedir

değişiklik aşağıdaki kodu kullanmak istiyorsunuz hash %ret, ve daha sonra

için bir başvuru döndürür. for döngüsünün sadece bir kez çalıştırılacağı ve bu kodun yanlış olduğu. Bunu düzeltmek yok, Eğer çalışırsa İşleviniz çağrısı

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

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

'un tam kopyaları İş yerimde oluşturulan bazı iç kütüphaneleri kullandım. {sshObj} -> exec(), exec(), kuruluşumuzun iç çerçevesinin bir parçası olan bir işlevdir. Cevabınız mükemmel ve beklendiği gibi çalışıyor. – nims