如果我将表格输出作为CSV写入文件,加载额外的模块有什么好处Text::CSV
将我的数据转换为对象让我通过基本的循环和字符串操作?我已经看到了几个建议这样做的答案:如何在Perl中使用DBI按顺序获取列名和行数据以及如何使用Perl创建CSV文件。
加载整个模块似乎是矫枉过正,对于我可以用四行 Perl 编写的东西(忽略数据检索等)来说,开销很大:
my $rptText = join(',', map { qq/"$_"/ } @head) . "n";
foreach my $person ( @$data ) {
$rptText .= join(',', map { qq/"$person->{$_}"/ } @head) . "n";
}
那么加载是什么Text::CSV
让我通过上面的代码?
对于简单的琐碎数据(诚然,这是很常见的),没有任何优势。你可以join
,print
,然后继续你的快乐之路。对于快速的一次性脚本,这可能是您所需要的(如果您需要查阅 Text::CSV 文档,速度也更快)。
当您的数据不平凡时,优势就开始了。
- 它包含逗号吗?
- 它是否包含双引号?
- 它是否包含换行符?
- 它是否包含非 ASCII 字符?
undef
(无值)和''
(空字符串)之间有区别吗?- 您是否需要使用不同的分隔符(或让用户指定它)?
对于生产代码,标准的专业模块建议适用:
- 重用而不是重新发明(特别是如果您要生成多个 CSV 文件)
- 它使您的代码更简洁(更一致,关注点分离更好)
- CPAN 模块通常比内部解决方案更快(优化得更好)、更健壮(边缘情况处理),并且具有更干净的 API。
- 加载模块的开销几乎可以肯定不是问题。
如果 CSV包含"
,则 CSV 将无效$person->{col1}
。此外,所有列都将用双引号括起来,这可能是不需要的(例如数字)。您还将获得未定义值的""
,如果您计划将 CSV 加载到区分null
和''
的数据库中,则可能无法正常工作。