いくつかの提案:
- Modern Perlに関する本を手に取ってください。Perl は粗雑な古い言語です。Perl でのプログラミング方法は、1980 年代に初めて登場して以来、何年にもわたって変化してきました。残念ながら、Perl 5.0 より前の時代に書かれた Web サイトから Perl を学ぶ人が多すぎます。
use strict;
プログラムでandを使用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
します。