(Perl)在地图中使用未初始化的值$ _

130*_*nrd 1 perl initialization export-to-csv

我正在尝试使用以下代码将查询结果导出到CSV文件:

while (my $query_result = $query_select->fetchrow_arrayref) {       
print $fh join (',', map {s{"}{""}g; "=\"$_\"";} @$query_result), "\n";
}
Run Code Online (Sandbox Code Playgroud)

并得到这些警告:

  1. 在连接(.)或字符串中使用未初始化的值$ _
  2. 在替换中使用未初始化的值$ _(s ///)

因为某些记录中有NULL值.

如何在代码中将未定义的值替换为空字符串

谢谢.

TLP*_*TLP 7

不要试图破解自己的版本,使用正确的CSV模块,就像Text::CSV这样做.例如:

use strict;
use warnings;

use Text::CSV;

my $csv = Text::CSV->new( { 
    binary => 1,
    eol => $/, 
} );

...

$csv->print(*STDOUT, $query_result);
Run Code Online (Sandbox Code Playgroud)

  • 顺便说一下,有正当理由不使用Text :: CSV,例如它不是核心模块.问题可能出现在另一个背景下. (2认同)
  • @fjardon,这不是正当理由.如果您可以从SO安装代码,则可以从CPAN安装代码. (2认同)
  • @fjardon,你没有说人们无法安装Text :: CSV,因为它不可移植; 你说人们无法安装Text :: CSV,因为它在CPAN上.这不是真的,对于Text :: CSV不可移植的任何说法都是如此. (2认同)
  • @fjardon这个问题是通常所说的[XY问题]的一个例子(http://meta.stackexchange.com/questions/66377/what-is-the-xy-problem).因此他目前的问题不是他真正的问题.处理未定义的问题是非常基本的,对于每个案例,如何最好地处理它会有所不同.你的解决方案,隐藏问题,并不总是一个好主意.有时你想知道未定义的值. (2认同)
  • 重新"你说每个人都可以安装所有的cpan包",我说没有这样的事情!我只是反驳你声称Text :: CSV不是核心模块是不使用它的正当理由. (2认同)
  • @Borodin,如果这是真的,那么他们也无法安装Text :: CSV_PP.但事实并非如此.您正在谈论可以安装应用程序的普通用户.(安装模块没有其他原因.)你已经说服了这个用户安装Perl,所以他也应该没有问题`cpan Module :: Name`. (2认同)