2012-07-03 5 views
-1

배열에서 데이터를 반환하려고합니다. 코드는 다음과 같습니다 :서브 루틴에서 배열 반환

my %ignorables = map { $_ => 1 } qw([notice mpmstats: rdy bsy rd wr ka log dns cls bsy: in); 

open my $error_fh, '<', 'iset_error_log'; 

sub findLines { 

    # Iterates over the lines in the file, putting each into $_ 
    while (<$error_fh>) { 

     # Only worry about the lines containing [notice 
     if (/\[notice/) { 

      if (/\brdy\b/){ 
       print "\n"; 
      } 
      else { 
       print ","; 
      } 

      # Split the line into fields, separated by spaces, skip the %ignorables 
      my @line = grep { not defined $ignorables{$_} } split /\s+/; 

      # More cleanup 
      s/|^\[|notice|[]]//g for @line; # remove [ from [foo 

      # Output the line 
      @line = join(",", @line); 
      s/,,/,/g for @line; 
      print @line; 
      } 
     } 
    } 

&findLines; 

I 인쇄, 출력은 다음과 같다 :

Mon,Jun,25,23:24:43,2012,999,1,0,1,0,0,0,0,Mon,Jun,25,23:24:43,2012,1,mod_was_ap22_http.c 
Mon,Jun,25,23:32:44,2012,999,1,0,1,0,0,0,0,Mon,Jun,25,23:32:44,2012,1,mod_was_ap22_http.c 
Mon,Jun,25,23:33:44,2012,999,1,0,1,0,0,0,0,Mon,Jun,25,23:33:44,2012,1,mod_was_ap22_http.c 
Mon,Jun,25,23:45:44,2012,999,1,0,1,0,0,0,0,Mon,Jun,25,23:45:44,2012,1,mod_was_ap22_http.c 

가 어떻게 서브 루틴 외부의 배열을 반환합니까?

+6

당신은 대신 인쇄의 의미? 영리하게 위장 된 [return] (http://perldoc.perl.org/functions/return.html) 연산자. 하지만 당신은 아마 뭔가 다른 것을 의미했을 것입니다. – Schwern

+1

http://perlmonks.org/?node_id=979557 – toolic

답변

1

테스트되지 않음 :

sub findLines { 
    my($item,@result); 

    # Iterates over the lines in the file, putting each into $_ 
    while (<$error_fh>) { 

     # Only worry about the lines containing [notice 
     if (/\[notice/) { 

      if (/\brdy\b/){ 
       print "\n"; 
       push @result,"$item\n"; 
       $item=""; 
      } 
      else { 
       print ","; 
       $item.=","; 
      } 

      # Split the line into fields, separated by spaces, skip the %ignorables 
      my @line = grep { not defined $ignorables{$_} } split /\s+/; 

      # More cleanup 
      s/|^\[|notice|[]]//g for @line; # remove [ from [foo 

      # Output the line 
      @line = join(",", @line); 
      s/,,/,/g for @line; 
      print @line; 
      map $item.=$_, @line; 
     } 
    } 
    @result 
} 

my @array = &findLines; 
+0

그것은 작동합니다! 문제는 오류 만 표시한다는 것입니다. "연결 (또는) 문자열에서"초기화되지 않은 값 $ item 사용 ", $ item \ n"; – rupes0610

+0

my ($ item, @ result) = (""); –

7
sub findLines { 
    ... 
    return @list; # Returns array @list 
} 
my @results = findLines(); 

# or 
sub findLines { 
    ... 
    return \@list; # returns a reference to array @list 
} 
my $resultsRef = findLines(); 

내가/else 문이하고있는 경우 모르겠어요,하지만 난 당신이 \ n 또는 ,@list에 밀어 싶은 생각합니다.

또한 서브 루틴에서 파일을 열고 매개 변수에서 열 파일을 전달해야합니다.

관련 문제