【发布时间】:2014-10-29 12:25:08
【问题描述】:
我是 Perl 的新手,我不太明白我的代码有什么问题。我相信我正确使用了语法,但我怀疑问题可能出在这一行:
push @students, \%information;
我想要的是学生列表包含学生信息的哈希值。我期望的是,每次添加学生后,都会创建学生信息的另一个哈希值,并链接到列表的最新索引。但是发生的情况是,如果我同时输入学生数据,最新的会覆盖以前的数据,因此当您打印它时,您会在上一个列表条目中看到最新输入信息的副本。如果我输入了一个学生并在添加后立即查看,然后输入另一个学生,最新的学生会覆盖之前的学生。有人可以阐明这一点吗?谢谢!
这是我的代码:
use strict;
use warnings;
my $userchoice = 0;
my $i;
my @students = (); #empty array
my %information = ();
while ( $userchoice != 4 ) {
print "------------------------------\n";
print "Welcome! What would you like to do?\n";
print "[0]Create Student Record\n";
print "[1]Edit Student Record\n";
print "[2]View Student Record\n";
print "[3]Delete Student Record\n";
print "[4]Exit\n";
print "Your Choice : ";
$userchoice = <STDIN>;
chomp($userchoice);
if ( $userchoice == 0 ) {
print "-----------\n";
print "CREATE STUDENT RECORD.\n";
if ( $#students <= 9 ) {
print "Name : ";
$information{"name"} = <STDIN>;
chomp( $information{"name"} );
push @students, \%information;
}
print "Student Record Full. " if ( $#students >= 10 );
}
if ( $userchoice == 2 ) {
print "\nVIEW STUDENTS.\n";
print "[0]View One Student\n";
print "[1]View All Students\n";
print "[2]Back to Main Menu\n";
print "Your Choice : ";
$userchoice = <STDIN>;
if ( $userchoice == 1 ) {
print "VIEW ALL STUDENTS.\n";
print "STUDENT 1---------------\n";
print "Name : ", $students[0]->{"name"}, " \n";
print "STUDENT 2---------------\n";
print "Name : ", $students[1]->{"name"}, " \n";
}
}
}
【问题讨论】:
-
您需要每次都使用对新哈希的引用,而不是每次都尝试引用相同的哈希。最简单的方法是在循环体内定义
%information。 -
解决了!感谢乔纳森。它确实被重复了,因为列表类型引用了相同的哈希......谢谢!
标签: arrays perl list hash push