2015-11-26 50 views
0

爲什麼當我將編碼格式添加到打開模式時,空字段不會導致未定義的值?Text :: CSV - 用編碼打開 - blank_is_undef

#!/usr/bin/env perl 
use strict; 
use warnings; 
use Text::CSV; 
use Data::Dumper; 

my $file = 'TEST.csv'; 
open my $fh, '>', $file or die $!; 
print $fh 'hello,,world'; 
close $fh; 

my $csv = Text::CSV->new({ 
    sep_char    => ',', 
    auto_diag   => 1, 
    blank_is_undef  => 1, 
    binary    => 1, 
}); 

open $fh, '<', $file or die $!; 
my $tmp; 
while (my $row = $csv->getline($fh)) { 
    push @$tmp, $row; 
} 
close $fh; 
print Dumper $tmp; 

#$VAR1 = [ 
#   [ 
#   'hello', 
#   undef, 
#   'world' 
#   ] 
#  ]; 

open $fh, '<:encoding(UTF-8)', $file or die $!; 
$tmp = []; 
while (my $row = $csv->getline($fh)) { 
    push @$tmp, $row; 
} 
close $fh; 
print Dumper $tmp; 

#$VAR1 = [ 
#   [ 
#   'hello', 
#   '', 
#   'world' 
#   ] 
#  ]; 

回答

3

這似乎是在Text::CSV_PP一個錯誤(Text::CSV_XS不顯示這種症狀)

的問題是,如果從文件中讀取的線被標記爲UTF-8編碼的,則使用分隔字符拆分的每個字段都會通過utf8::encode,即使之前已將其設置爲undef,因爲該字段爲空且啓用blank_is_undef選項。這錯誤地設置回一個空字符串

可以明確地使用Text::CSV_XS代替,或有其可以在Text::CSV對象的其他選項一起被設置爲false無證選項decode_utf8,或者如果你需要處理UTF -8正確,那麼你應該使用Text::CSV::Encoded

+1

我認爲'文本:: CSV_XS'已安裝,但它不是。現在使用'Text :: CSV_XS'安裝它可以正常工作。 –