如何在 Perl 中编写复杂的哈希数组?
How to code a complex array of hashes in Perl?
这是一个让我困惑了很长一段时间的任务:
通常,我们会以 .csv 文件的形式获取学生的考试成绩。 header有一些元数据,比如ID、性别、出生日期、状态、考场、座位号、考试版本,以及60道题的分数(0.0 0.5 1.0分,如果答案错误,一半正确,或正确).考试有 6 个版本 (A - F),区别仅在于 60 个问题的顺序。存储信息用于统计评估,这需要根据考试大师进行正确对齐(A-F 版本有 7 列的 .txt 文件和第 7 列中的正确答案)。
我试图将 .csv 文件容纳为哈希数组,以生成不同的 .csv 或选项卡式 .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,.5,.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,.5,.5,1,1,1,.5,.5,1,1,1,1,0,0,.5,1,1,. 5,.5,.5,.5,0,1,0,.5,0,0,1,0,1,.5,0,1,0,0,.5,1,0,1, 1,0,.5,.5,.5,.5,.5,.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" ;
编译器会针对每条记录发出警告,例如"Odd number of elements in anonymous hash at /Documents//testAoH.pl line 38, line 16." 但脚本已执行。
脚本打印了正确数量的已处理记录,但是当我尝试检索特定记录时,我只得到标量值,@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'
};
有什么线索吗?
谢谢 - 哈拉尔 -
使用\@积分。 @points 在哈希构造函数中扩展以生成:
'Points' => $points[0], $points[1] => $points[2], ...
这是一个让我困惑了很长一段时间的任务: 通常,我们会以 .csv 文件的形式获取学生的考试成绩。 header有一些元数据,比如ID、性别、出生日期、状态、考场、座位号、考试版本,以及60道题的分数(0.0 0.5 1.0分,如果答案错误,一半正确,或正确).考试有 6 个版本 (A - F),区别仅在于 60 个问题的顺序。存储信息用于统计评估,这需要根据考试大师进行正确对齐(A-F 版本有 7 列的 .txt 文件和第 7 列中的正确答案)。 我试图将 .csv 文件容纳为哈希数组,以生成不同的 .csv 或选项卡式 .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,.5,.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,.5,.5,1,1,1,.5,.5,1,1,1,1,0,0,.5,1,1,. 5,.5,.5,.5,0,1,0,.5,0,0,1,0,1,.5,0,1,0,0,.5,1,0,1, 1,0,.5,.5,.5,.5,.5,.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" ;
编译器会针对每条记录发出警告,例如"Odd number of elements in anonymous hash at /Documents//testAoH.pl line 38, line 16." 但脚本已执行。
脚本打印了正确数量的已处理记录,但是当我尝试检索特定记录时,我只得到标量值,@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'
};
有什么线索吗?
谢谢 - 哈拉尔 -
使用\@积分。 @points 在哈希构造函数中扩展以生成: 'Points' => $points[0], $points[1] => $points[2], ...