2014-10-13 7 views
-3
if($DSTIP =~ s/(\.)(\d{1,6}$|\w{2,6})$//g){ 
      $dstip = $dinterface->("$DSTIP"); 
      $dstport = $PORTS->("$2"); 
    } 
if($DSTIP =~ s/(\.)(\d{1,6}$|\w{2,6})$//g){ 
      $dstip = $dinterface->("$DSTIP"); 
      $dstport = $PORTS->("$2"); 
    } 

나는 한 줄 위의 코드를 다시 작성하려고합니다. 나는 시도했다 :코드 중복 방지

 if($SRCIP && $DSTIP =~ s/(\.)(\)l{1,6}$|\w{2,6})$//g){ 
     ($srcip, $dstip) = ($dinterface->("$SRCIP"), $dinterface->("$DSTIP")); 
     ($srcport, $dstport) = ($PORTS->("$2"), $PORTS->("$2")); 
} 

나를 위해 일하지 않는다.

+3

그리고 지금은? 질문이 뭐야? – Theolodis

+1

'string && string = ~ regex'? 그것의 길고 열심히 살펴보고 싶어 할 수도 ... –

+4

코드의 첫 번째 버전에서 복사/붙여 넣기 오류가있는 것 같습니다? –

답변

6

다른 데이터와 동일한 코드를 다시 사용해야하는 경우이를 함수에 넣습니다. 귀하의 경우에는 (다소간의) 글로벌 범위에 관련된 몇 가지 변수가 있음에 유의하십시오. $dinterface$PORTS은 함수에서 액세스 할 수 있지만 거기에는 정의되어 있지 않습니다. 그것은 나쁜 습관입니다.

sub parse_ip { 
    my ($ip) = @_; 

    return ($dinterface->($ip), $PORTS->($2)) 
     if $ip && $ip =~ s/(\.)(\)l{1,6}$|\w{2,6})$//g; 
    return (undef, undef); 
} 

# later 
my ($dstip, $dstport) = parse_ip($DSTIP); 
my ($srcip, $srcport) = parse_ip($SRCIP);