Perl 将grep结果映射到csv文件

Perl 将grep结果映射到csv文件,perl,csv,Perl,Csv,我正在尝试将grep结果填充到csv文件。但它显示了以下错误。 “在连接(.)或字符串中使用未初始化的值” 代码: sub gen\u csv{ 我的$db_ptr=shift@; 我的$cvs_file_name=shift@; 打开(文件“>$cvs_文件名”)或死亡(“无法打开CSV文件$cvs_文件名\n”); 打印文件“频道号,页码,\n”; foreach my$s(@{$db_ptr}){ my$tmp=“$s->{'chu no'}”; $tmp.=“$s->{'pg_no'}”

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

代码:

sub gen\u csv{
我的$db_ptr=shift@;
我的$cvs_file_name=shift@;
打开(文件“>$cvs_文件名”)或死亡(“无法打开CSV文件$cvs_文件名\n”);
打印文件“频道号,页码,\n”;
foreach my$s(@{$db_ptr}){
my$tmp=“$s->{'chu no'}”;
$tmp.=“$s->{'pg_no'}”;
打印文件$tmp;
}
关闭(文件);
}
子解析测试日志{
我的$chnl;
我的$page;
my$log=“sample.log”;

在gen_csv模块中打开我的$log_fh,“{'Chu no'}”

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

如果您不关心空值,并且对缺少某些值没有问题,那么您可以取消对未初始化值的警告

no warnings 'uninitialized';

您的问题涉及此块:

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

    my %test_details = (
        'ch_no' => $chnl,
        'pg_no' => $page,  
    );
您正在捕获变量,但在
if
块中用
my
声明了它们。这些词汇随后超出范围,在用于初始化哈希时是
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;
}
子解析测试日志{
my$log=“sample.log”;

打开我的$log\u fh,“您的%test\u详细信息的密钥pg\u no缺少一个引号eadd
use strict;
use warnings;
并且最好使用open和lexical filehandles的3参数形式。
open(我的$fh,'谢谢您)。错误消失了。但是这些值正在csv文件中不断填充(我指的是一行中所有匹配的值)。相反,我希望每组值显示在不同的行上。请告诉我应该做什么。
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;
}