問題描述
從子程序返回數組 (Return array from subroutine)
I am attempting to return data from an array. Code is below:
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;
When I print, output is as follows:
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
How do I return the array outside the subroutine?
參考解法
方法 1:
sub findLines {
...
return @list; # Returns array @list
}
my @results = findLines();
# or
sub findLines {
...
return \@list; # returns a reference to array @list
}
my $resultsRef = findLines();
I don't know what your if/else statement is doing, but I think you want to push the \n or ,
to @list
.
Also, you should probably open the file in the subroutine and pass the file to be opened in the parameters.
方法 2:
Not tested:
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;
(by rupes0610、gtjason2000、Nahuel Fouilleul)