几个建议:
- 拿起一本关于Modern Perl的书。Perl 是一门充满蹩脚的古老语言。自 1980 年代首次出现以来,您使用 Perl 编程的方式已经发生了多年的变化。不幸的是,太多人从 Perl 5.0 之前的网站上学习 Perl。
- 在你的程序中使用
use strict;
和。use warnings;
这将捕获您的大部分编程错误。
- 不要依赖
$_
。它是全球性的,可能会导致问题。for (@people) {
看起来很整洁,但最好这样做for my $person ( @people )
。
/../
在split
和'...'
中使用join
。
- 使用变量作为文件句柄。它们更容易传递给子程序:
这是你的程序:
我用更现代的风格重写了你的程序,它和你所拥有的差不多。我做了一些错误检查,但除此之外,它可以工作:
use strict;
use warnings;
use feature qw(say); # Nicer that print.
use autodie; # Will automatically die on open and close errors
if ( @ARGV < 2 ) {
die qq(Not enough arguments);
}
my $tf_id_file = shift; # Use variable names and not `@ARGV` directly
my $id_file = shift; # Makes your program easier to understand
open my $tf_ids_fh, "<", $tf_id_file;
my %hash; # Not a good name for the variable, but that's what you had.
while ( my $line = <$tf_ids_fh> ) {
chomp $line; # Always chomp after a read
my ( $text, $id ) = split /\s+/, $line; # Use variable names, not @fields
if ( not defined $id ) { # Error checking
die qq(Missing id field in line $. of tf_ids file);
}
$hash{$text} = $id;
}
close $tf_ids_fh;
open my $ids_fh, "<", $id_file;
my @ids = <$ids_fh>;
chomp @ids;
close $ids_fh;
my %totals;
for my $id ( @ids ) {
if ( not exists $totals{ $hash{$id} } ) { #Initialize hash before adding to it
$totals{ $hash{$id} } = 0;
}
$totals{ $hash{$id} }++;
}
for my $family ( sort keys %totals ) {
printf "%10.10s %4d\n", $family, $totals{$family};
}
我使用printf来格式化你的打印输出,它比普通的要好一些print
。