=head1 NAME Enjoy! Perl Programming - No.29 =head1 SYNOPSIS データの保存 - ファイル処理の実際(4) =head1 DESCRIPTION Perl言語におけるファイル処理の実際。 =head2 特定行のデータを修正する ファイルの途中にある特定の行を修正したい。 # [例題29-1] print '-' x 5 . "New file created\n"; open FH, '>no29-1.write.txt' or die "File open error: $!"; print FH <<'DATA'; XJR1200,600000 SRS400,1350000 XJR400,400000 DATA close FH; print '-' x 5 . "Reading\n"; open FH, 'no29-1.write.txt' or die "File open error: $!"; print while (); close FH; print '-' x 5 . "Updating\n"; open FH, '+; # 配列にファイルをコピーする foreach ( @file ) # 行について何かする { chomp; if ( 'SRS400' eq (split /,/)[0] ) { push @ary, "SR400,298000\n"; } else { push @ary, "$_\n"; } } seek FH, 0, 0; # ファイルハンドルの位置を先頭に移動 print FH @ary; # ファイルに書込み truncate FH, tell(FH); # ファイルを切り詰める close FH; # ファイルクローズ print '-' x 5 . "Reading\n"; open FH, 'no29-1.write.txt' or die "File open error: $!"; print while (); close FH; この例では修正するファイルを読み書きモードでオープンしている。 読み書きモードでは常に現在のファイルハンドル位置を考えながら 操作する必要がある。ファイルに書込む前に "seek" 関数にてファ イルハンドルをファイルの先頭まで移動していることと、書込み後 に "truncate" 関数にて現在のファイルハンドル位置でファイルを 切り詰めていることに注目したい。 =head1 SEE ALSO "open","print","truncate","seek" 関数のドキュメントページ。 "perlfaq5" マニュアルページ =head1 TESTED OS : Windows 2000 Perl: ActivePerl v5.6.1 build 631 =head1 AUTHOR Name:吉田和弘(YOSHIDA Kazuhiro) Email:y-kazu@lares.dti.ne.jp Homepage:http://www.lares.dti.ne.jp/~y-kazu/perl/