为什么这个函数在Perl中没有写入我的文件?

时间:2014-09-14 13:17:04

标签: perl file-io

我在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";
}

2 个答案:

答案 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";

}