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

サブルーチンの外に配列を返すにはどうすればよいですか?

4

2 に答える 2

16
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

また、おそらくサブルーチンでファイルを開き、開くファイルをパラメーターで渡す必要があります。

于 2012-07-03T02:11:30.887 に答える
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;
于 2012-07-03T10:54:16.250 に答える