gpt4 book ai didi

perl - 多个文件句柄打开同一个文件-这是一种好习惯吗?

转载 作者:行者123 更新时间:2023-12-04 14:48:22 25 4
gpt4 key购买 nike

我有grades.tsv文件,其中包含三列,分别显示学生的姓名,科目和成绩:

Liam    Mathematics 5
Liam History 6
Liam Geography 8
Liam English 8
Aria Mathematics 8
Aria History 7
Aria Geography 6
Isabella Mathematics 9
Isabella History 4
Isabella Geography 7
Isabella English 5
Isabella Music 8

我想计算每个学生的平均成绩,并将其添加到单独的列中。为此,我使用了两个文件句柄DATA和OUT打开同一文件:
use strict;
use warnings;

# Open file with grades for calculation of average grade for each student
open (DATA,"grades.tsv") or die "Cannot open file\n";

my %grade_sums;
my %num_of_subjects;

# Calculate sum of grades and number of subjects for each student
while( <DATA> ) {

chomp;
my ($name, $subject, $grade) = split /\t/;

$grade_sums{$name} += $grade;
$num_of_subjects{$name} += 1;
}

close DATA;


# Open file with grades again but this time for a purpose of adding a separate column with average grade and printing a result
open (OUT,"grades.tsv") or die "Cannot open file\n";

while ( <OUT> ) {
chomp;
my ($name, $subject, $grade) = split /\t/;

# Calculate average grade
my $average_grade = $grade_sums{$name} / $num_of_subjects{$name};
my $outline = join("\t", $name, $subject, $grade, $average_grade);

# Print a file content with new column
print "$outline\n";
}

close OUT;

该代码可以工作,但是我不确定这是否是完成此任务的正确方法。这是一个好习惯还是应该有更好的首选方法?

最佳答案

重新打开文件就可以了。一种替代方法是将seek移至文件的开头。

use Fcntl qw( SEEK_SET );

seek(DATA, 0, SEEK_SET);

寻求效率更高,因为它不必检查权限等。它还能保证您获得相同的文件(但没有人更改过它)。

另一种选择是将整个文件加载到内存中。那就是我通常要做的。

注意
open(FH, $qfn) or die "Cannot open file\n";

最好写成
open(my $FH, '<', $qfn)
or die("Can't open file \"$qfn\": $!\n");
  • 三个参数的open避免了一些问题。
  • 在错误消息中包含错误原因是有益的。
  • 在错误消息中包含路径是有益的。
  • 应该避免使用DATA,因为Perl有时会自动使用该名称创建一个句柄。
  • 应该避免使用全局变量(例如FH)或词汇变量(my $FH)。
  • 关于perl - 多个文件句柄打开同一个文件-这是一种好习惯吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59991322/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com