2012-07-03 23 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; 

當我打印,輸出如下:

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連接(。)或字符串」在線push @result,「$ 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(); 

我不知道你的if/else語句是做什麼的,但我想你想推\ n,@list

此外,你應該打開的子程序的文件,並傳入參數要打開的文件。