在替换中使用未初始化的值$ _(s ///)

obs*_*bsi 2 regex perl substitution

我有一个运行和下载一些数据的脚本.一切正常,大约60拉,然后我突然得到错误:

在替换中使用未初始化的值$ _(s ///)

while ( my $row = $ia_applicant_query->fetchrow_arrayref ) {

    s/\t/ /g for @$row;    # <------- THIS IS WHAT THE ERROR POINTS TO
    my $line = join "\t", map { defined $_ ? $_ : '.' } @$row;
    $mydb->func( "$line\n", "putline" );
}
Run Code Online (Sandbox Code Playgroud)

然后仅对剩余的800次拉动重复该错误.什么想法会出错?

ike*_*ami 8

这意味着其中一个值@$rowundef,如果列是,则会发生NULL.

这可以通过替换来避免

s/\t/ /g for @$row;
my $line = join "\t",  map { defined($_) ? $_ : '.' } @$row;
Run Code Online (Sandbox Code Playgroud)

my $line = join "\t",  map { defined($_) ? s/\t/ /gr : '.' } @$row;   # 5.14+
Run Code Online (Sandbox Code Playgroud)

要么

sub tabs_to_spaces { ( my $s = shift ) =~ s/\t/ /g; $s }

my $line = join "\t",  map { defined($_) ? tabs_to_spaces($_) : '.' } @$row;
Run Code Online (Sandbox Code Playgroud)