为什么我的perl哈希不返回值?
我正在接收CSV文件:为什么我的perl哈希不返回值?,perl,hash,Perl,Hash,我正在接收CSV文件: "ID","LASTNAME","FIRSTNAME","PERM_ADDR1","PERM_ADDR2","PERM_CITY","PERM_ST","PERM_ZIP","DOB","LIB_TYPE","BARCODE","EMAIL","LOCAL_ADDR1","LOCAL_ADDR2","LOCAL_CITY","LOCAL_ST","LOCAL_ZIP","CAMPUS_ADDR1","CAMPUS_ADDR2","CAMPUS_CITY","CAMPUS_
"ID","LASTNAME","FIRSTNAME","PERM_ADDR1","PERM_ADDR2","PERM_CITY","PERM_ST","PERM_ZIP","DOB","LIB_TYPE","BARCODE","EMAIL","LOCAL_ADDR1","LOCAL_ADDR2","LOCAL_CITY","LOCAL_ST","LOCAL_ZIP","CAMPUS_ADDR1","CAMPUS_ADDR2","CAMPUS_CITY","CAMPUS_ST","CAMPUS_ZIP","DEPARTMENT","MAJOR"
"123","Lastname","Firstname","123 Home St","","Home City","HS","12345-6789","0101","S","1234567890","last.first@domain.local","123 Local St","","Local City","LS","98765-4321","123 Campus St","","Campus City","CS","54321-6789","IT",""
使用Text::CSV
,我试图将其解析为散列:
my $csv = Text::CSV->new();
chomp(my $line = <READ>);
$csv->column_names(split(/,/, $line));
until (eof(READ)) {
$line = $csv->getline_hr(*READ);
my %linein = %$line;
my %patron;
$patron{'patronid'} = $linein{'ID'};
$patron{'last'} = $linein{'LASTNAME'};
$patron{'first'} = $linein{'FIRSTNAME'};
print p(%linein)."\n";
print p(%patron)."\n";
}
我不明白的是为什么%patron
中的%linein
中的值没有被填充。我想知道这是否与使用Text::CSV
有关,因为我在脚本的其他地方解析其他文件,它们工作得很好。但是,这些文件不是CSV文件,而是固定宽度的文件,所以我正在手动解析它们。试试看
$csv->column_names(map {/"(.*)"/ and $1} split(/,/, $line))
而不是
$csv->column_names(split(/,/, $line));
您的CSV密钥被定义为文本字符串
'"LASTNAME"' , '"FIRSTNAME"'
而不仅仅是
'LASTNAME' , 'FIRSTNAME'
Data::Printer
在向您展示所发生的事情方面做得并不差-
p(%linein)
中的所有键显示为包含双引号作为
该字符串与
p(%patron)
相反,请尝试使用use Data::Dumper;打印转储程序(用户%)代码>。如果您能按预期看到输出,那么问题可能在于p()
子例程。使用您的方法(有效)后,我意识到我还没有完全理解Text::CSV->column\u names()
方法。在重新阅读CPAN文档之后,我尝试了$csv->column_names($csv->getline(*READ))
也可以使用,而且它的优点是更容易阅读。谢谢
'LASTNAME' , 'FIRSTNAME'