【问题标题】:Return array from subroutine从子程序返回数组
【发布时间】:2016-04-24 17:31:11
【问题描述】:

我正在尝试从数组中返回数据。代码如下:

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

如何在子程序外返回数组?

【问题讨论】:

  • 您的意思是不打印它?使用巧妙伪装的return 运算符。但你可能还有别的意思。

标签: perl 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();

我不知道您的 if/else 语句在做什么,但我认为您想将 \n, 推送到 @list

另外,你可能应该在子程序中打开文件,并在参数中传递要打开的文件。

【讨论】:

    【解决方案2】:

    未测试:

    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;
    

    【讨论】:

    • 有效!唯一的问题是它也显示错误。 "使用未初始化的值 $item 在连接 (.) 或字符串中" 上线 push @result,"$item\n";
    猜你喜欢
    • 2019-12-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多