我在Perl中操作文件相对较新。我不知道这段代码有什么问题,它没有写任何东西给我的文本文件。我不认为这是我的数据结构,因为我有另一个功能,它打印数据结构的内容,数据就在那里。它只是没有写在文件中。我错过了什么吗?
以下是代码:
sub saveFile {
open( my $out, ">", "inputs.txt" );
for ( $i = 0; $i < $#students; $i++ ) {
print $out $students[$i]->{"name"};
print $out $students[$i]->{"studNum"};
print $out $students[$i]->{"cNum"};
print $out $students[$i]->{"emailAdd"};
print $out $students[$i]->{"gwa"};
print $out $students[$i]->{"subjNum"};
for ( $j = 0; $j < $students[$i]->{"subjNum"}; $j++ ) {
print $out $students[$i]->{"subj"}->[$j]->{"courseNum"};
print $out $students[$i]->{"subj"}->[$j]->{"courseUnt"};
print $out $students[$i]->{"subj"}->[$j]->{"courseGrd"};
}
}
close $out;
print "FILE SAVED.\n";
}
答案 0 :(得分:4)
您已使用<
,您应该在循环条件中使用<=
。
for ( $i = 0; $i < $#students; $i++ ) {
# ^^-- here
因此,不会打印最后一个索引,我假设您只使用一条记录进行测试。
请注意,这是一种循环遍历数组的糟糕方式。一种非常优选的方法 - 除非你需要其他东西的数组索引 - 是循环实际的元素:
for my $student (@students) {
print $student->{"name"};
...
}
这里的每个元素都是一个哈希引用,这将大大简化您的输入并使您的代码更具可读性。
您还可以使用哈希切片打印记录,而不是逐个打印:
print @{$student}{qw(name studNum cNum emailAdd)};
请注意,您可能希望使用以下内容分隔各种值:
print join ",", @{$student}{qw(name studNum cNum emailAdd)};
最后,正如我在评论中所说,你应该避免使用全局变量。而是将数组传递给您的函数。结合我的所有建议,我想出了这个:
saveFile( \@students );
...;
use feature 'say'; # required for say()
sub saveFile {
my $aref = shift;
for my $student (@$aref) {
say join ",", @{$student}{qw(name studNum cNum emailAdd gwa subjNum)};
for my $subj ( @{ $student->{"subj"} } ) {
say join ",", @{$subj}{qw(courseNum courseUnt courseGrd)};
}
}
}
请注意,我已经取消了subjNum
密钥,这是多余的,因为它很容易获得数组的大小。
答案 1 :(得分:2)
虽然您的源格式需要改进,但您的技术基本上是正确的。但是,您的代码中存在这个小错误:
$i<$#students
将其设为$i<=$#students
或$i<@students
。那应该可以解决你的麻烦。
顺便说一下,如果你想改进格式(和成语),那么这个替代方案可能会给你一些想法:
sub saveFile {
open(my $out, '>', 'inputs.txt');
for (my $i = 0; $i <= $#students; ++$i) {
print $out $students[$i]{name};
print $out $students[$i]{studNum};
print $out $students[$i]{cNum};
print $out $students[$i]{emailAdd};
print $out $students[$i]{gwa};
print $out $students[$i]{subjNum};
for (my $j = 0; $j < $students[$i]{subjNum}; ++$j) {
print $out $students[$i]{subj}[$j]{courseNum};
print $out $students[$i]{subj}[$j]{courseUnt};
print $out $students[$i]{subj}[$j]{courseGrd};
}
}
close $out;
print "FILE SAVED.\n";
}