无法在perl中获得CSV格式的所需哈希值

pav*_*van 4 perl perl-data-structures

我已将最常见的emp表导出为CSV.我想将每个列名称作为哈希键并将值存储在数组中.

下面是代码

 use Data::Dumper;
    open($fh,"<EMP.csv");
    %hash = ();

    local $/= "\n";

    while(<$fh>){

         @columnNames = split(/,/,$_) if $. ==1;     
         @columnValues = split(/,/,$_);  
          push @{hash->{@columnNames}} ,@columnValues;       
    }

    print Dumper(\%hash);
Run Code Online (Sandbox Code Playgroud)

当我尝试打印哈希时,我得到了这个

$VAR1 = {
          '8' => [
                   '"EMPNO"',
                   '"ENAME"',
                   '"JOB"',
                   '"MGR"',
                   '"HIREDATE"',
                   '"SAL"',
                   '"COMM"',
                   '"DEPTNO"
',
                   '"7839"',
                   '"KING"',
                   '"PRESIDENT"',
                   '""',
                   '"11/17/1981"',
                   '"5000"',
                   '""',
                   '"10"
',
Run Code Online (Sandbox Code Playgroud)

但我期待这一点

$VAR1 = { '"EMPNO"'=>[12,3,4,5,6,7,8,9],
          '"EMPNAME"'=>["pavan","kumar"...],

};
Run Code Online (Sandbox Code Playgroud)

TLP*_*TLP 5

您试图在推送语句中使用切片,但这不起作用.数组将处于标量上下文中,这就是您看到密钥的原因8.您需要循环键以将值推送到数组上.但是,为什么这样呢?

您可以使用该Text::CSV模块,这是相当简单的,可能更合适,假设您有一个真正的csv格式.

use strict;
use warnings;
use Data::Dumper;
use Text::CSV;

my $csv = Text::CSV->new({
        binary  => 1,
        eol     => $/,
    });
my %data;
open my $fh, "<", "yourfile.csv" or die $!;
$csv->column_names ($csv->getline($fh));          # get header names

while (my $row = $csv->getline_hr($fh)) {         # get hashref with values
    for my $key (keys %$row) {
        push @{$data{$key}}, $row->{$key};        # store values
    }
}
print Dumper \%data;
Run Code Online (Sandbox Code Playgroud)