将grep结果映射到csv文件

时间:2014-10-16 13:44:02

标签: perl csv

我正在尝试将grep结果填充到csv文件中。但它显示以下错误。 “在连接(。)中使用未初始化的值或在”

中使用字符串

代码:

sub gen_csv {
    my $db_ptr        = shift @_;
    my $cvs_file_name = shift @_;
    open( FILE, ">$cvs_file_name" ) or die("Unable to open CSV FILE $cvs_file_name\n");
    print FILE "Channel no, Page no, \n";
    foreach my $s ( @{$db_ptr} ) {
        my $tmp = "$s->{'ch_no'},";
        $tmp .= "$s->{'pg_no'},";
        print FILE $tmp;
    }
    close(FILE);
}

sub parse_test_logs {
    my $chnl;
    my $page;
    my $log = "sample.log";
    open my $log_fh, "<", $log;
    while ( my $line = <$log_fh> ) {
        if ( $line =~ /(.*):.*solo_(.*): queueing.*/ ) {
            my $chnl = $1;
            my $page = $2;
        }
        my %test_details = (
            'ch_no' => $chnl,
            'pg_no' => $page,    # <- was missing closing single quote
        );
        push( @{$dba_ptr}, \%test_details );
    }
    close log_fh;
}

关于我错过的任何建议? (我收到上述错误指向我的$ tmp =“$ s-&gt; {'ch_no'},”;在gen_csv模块中)

2 个答案:

答案 0 :(得分:0)

这很可能是由于您的数据库记录中的NULL值或您使用的密钥错误。无论哪种方式,警告都是因为ch_no值不存在。

如果您不关心NULL值,并且您可以使用某些值丢失,那么您可以禁止显示未初始化值的警告。

no warnings 'uninitialized';

答案 1 :(得分:0)

您的问题涉及此块:

    if ( $line =~ /(.*):.*solo_(.*): queueing.*/ ) {
        my $chnl = $1;
        my $page = $2;
    }

    my %test_details = (
        'ch_no' => $chnl,
        'pg_no' => $page,  
    );

您正在捕获变量,但是在my块中使用if声明了变量。那些词汇然后超出范围,并且在用于初始化哈希时为undef

我建议将解析功能简化为以下内容:

sub parse_test_logs {
    my $log = "sample.log";

    open my $log_fh, "<", $log;

    while (<$log_fh>) {
        if ( my ( $chnl, $page ) = /(.*):.*solo_(.*): queueing.*/ ) {
            push @{$dba_ptr}, { 'ch_no' => $chnl, 'pg_no' => $page };

        } else {
            warn "regex did not match for line $.: $_";
        }
    }

    close $log_fh;
}

最后,您可能已经存在,但我只想传递必要的建议,始终在每个Perl脚本的顶部包含use strict;use warnings;