如何在Perl中编写复杂的哈希数组?

时间:2017-03-21 02:32:43

标签: arrays csv hash perl-data-structures

这是一项困扰我很长一段时间的任务: 我们定期将学生的考试成绩作为.csv文件。标题包含一些元数据,如身份证,性别,出生日期,状态,考试室,座位号,考试版本以及60个问题的分数(如果答案错误,半正确或正确,则为0.0 0.5 1.0分) )。考试有6个版本(A - F),只有60个问题的顺序不同。存储信息用于统计评估,这需要根据检查主文件正确对齐(.txt文件,其中7列为版本A-F,第7列为正确答案)。 我试图将.csv文件作为一个哈希数组来生成一个不同的.csv或tabbed .txt文件,其中所有的考试结果都以统一的顺序出现,以便以后进行统计评估。

实施例: 标题 - ID,性别,出生日期,订单,室,座位,版本,点,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, ,,,,,,,,,,,,,,,,,,,,,,,,

277710814533,f,01/02/1993,m,sr_3,A11,A,1,1,1,1,0,1,1,1,.5,1,1,1,0,1, .5,1,1,1,0,1,.5,1,1,0,1,1,1,1,1,1,1,0,0,1,0,1,.5,1 ,1,1,1-,.5,0,1,1,1,0,1,1,1,1,1,0,1,1,1,.5,1,1,1

755310765962,f,31 / 07/1992 00:00,v,aula,C11,C,1,.5,0,1,1,1,1,1,1,1,1,1,1 ,1,0,1,1,1,1,1,0,1,1,1,1,0,1,1,1,.5,1,0,.5,1,0,1 ,. 5,0,.5,0,1,0,0,.5,1,1,0,.5,1,1,.5,.5,1,.5,.5,1,1,1 ,0.5,0.5

394610513538,m,20 / 10/1992 00:00,m,sr_3,E13,E,1,1,0,.5,1,1,1,1,1,1,1,.5, 1,1,0.5,.5,1,1,1,0.5,.5,1,1,1,1,0,0,.5,1,1,0.5,0.5,0.5, .5,0,1,0,.5,0,0,1,0,1,.5,0,1,0,0,.5,1,0,1,1,0,.5 ,. 5,0.5,0.5,0.5,0.5

代码根据以下方案生成散列密钥:

while ( <FH> ) {
chomp ;
if ( /^\d\d\d/) {
    ( $id , $gender , $birthday , $status , $room , $seat , $version , @points ) = split ( /,/ , $_ ) ;
    $student = { 
        'id'       => $id ,
        'gender'   => $gender , 
        'birthday' => $birthday ,
        'position' => $position ,
        'room'     => $room , 
        'seat'     => $seat ,
        'version'  => $version ,
        'points'   => @points
    } ;
    push ( @candidates , $student ) ;
}
} ;
close FH ;
print "Number of candidates processed: " . ( $#candidates + 1 ) . "\n" ;

编译器会为每条记录发出警告,例如&#34; /Documents//testAoH.pl第38行,第16行的匿名散列中的奇数元素数。&#34;但是脚本被执行了。

脚本打印正确数量的已处理记录,但是当我尝试检索特定记录时,我只获取标量值,而@points数组只产生一个(第一个?)结果,就像它被销毁一样。数据转储器输出进一步显示此代码必须内部错误。

数据转储器,例如

    755310765962 
$VAR1 = \{
        '0' => '0',
        'gender' => 'f',
        'id' => '755310765962',
        'points' => '1',
        'room' => 'aula',
        '.5' => undef,
        '1' => '.5',
        'birthday' => '31/07/1992',
        'seat' => 'A11',
        'version' => 'A',
        'status' => 'v'
      };

任何线索?

Thx - Harald -

1 个答案:

答案 0 :(得分:1)

使用\ @points。 @points在哈希构造函数中扩展以生成: 'Points'=&gt; $ points [0],$ points [1] =&gt; $ points [2],...