我正在尝试将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模块中)
答案 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;
。