從子程序返回數組 (Return array from subroutine)


問題描述

從子程序返回數組 (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 rupes0610gtjason2000Nahuel Fouilleul)

參考文件

  1. Return array from subroutine (CC BY-SA 3.0/4.0)

#perl #subroutine






相關問題

保持特定位數的簡單 Perl 數學 (simple Perl math while keeping a specific number of digits)

如何在 Windows 批處理腳本或 Perl 中將文件移動到回收站? (How can I move files to the Recycle Bin in a Windows batch script or Perl?)

從子程序返回數組 (Return array from subroutine)

我可以以與操作系統無關的方式限制 Perl 進程使用的內存嗎? (Can I Iimit the memory used by a Perl process in an OS-agnostic way?)

$# 在 perl 中接受什麼作為輸入? (what does $# accept as input in perl?)

Perl Text::CSV_XS 從字符串中讀取 (Perl Text::CSV_XS read from string)

使用 excel 2010 更新批處理文件中的變量 (use excel 2010 to update variables in batch file)

在 perl 中為哈希添加值 (Adding value to an hash in perl)

為什麼 perl 會忽略我的正則表達式中的多餘字符? (Why does perl ignore extra characters in my regex?)

boost::regex - \bb? (boost::regex - \bb?)

如果小於 X 天,如何從磁盤讀取文件,如果舊,則重新獲取 html 文件 (How to read a file from the disk if less than X days old, if older, refetch the html file)

使用 Devel-Cover 獲取覆蓋率報告 (Using Devel-Cover to get coverage reports)







留言討論