1

そのため、カレンダー ファイルを読み込んでファイルに日付を挿入していますが、日付を時系列のままにしたいと考えています。問題は、日付を入れる場所を見つけたときに発生します。ファイルは、挿入したいポイントをすでに過ぎています。

私が見ているカレンダーファイルは次のようになります。

# November 2010
11/26/2010
11/27/2010
11/28/2010
11/29/2010
11/30/2010
# December
12/24/2010
12/25/2010
12/26/2010
12/27/2010
12/28/2010
12/29/2010
12/30/2010

私のコードは次のようになります。

while (my $line = <FILE>) {
    if (substr($line, 0, 1) =~ m/\#/ || $line =~ m/calendar/) { #if the line is commented out or contains the calendar's name skip to next line
        next;
    }
    chomp($line);
    my ($temp_month, $temp_day, $temp_year) = split(/\//, $line, 3);
    if ($year == $temp_year && $month == $temp_month && $day < $temp_day) {
        ?
    }
}

ファイル内の前の場所を指す方法について何か提案はありますか?

4

4 に答える 4

6

ファイル内をランダムに移動するために必要な機能はseekです。しかし、Perl FAQ には、この問題に対処する方法に関する詳細情報があります - How do I change, delete, or insert a line in a file, or append to the beginning of a file?

于 2011-08-02T12:19:30.497 に答える
3

これはTie::Fileモジュールの優れた使い方のように思えます。ファイルを配列のように扱うことができ、ファイル ポインターの現在の位置を気にする必要はありません。また、ファイル全体をメモリにロードすることにも依存しないため、大量のファイルを処理できます。

use Tie::File;

tie @array, 'Tie::File', $file;

for (my $i =0; $i <= @array; $i++) {
    if (/date comparison/*see note below) {
        splice @array, $i, 0, $new_date;
    }
}

これにより、splice などの perl の配列関数を使用して新しい行を挿入できるようになります。

しかし、日付比較戦略にも大きな問題があります。特定の月と年の組み合わせの日付がまだファイルにない場合はどうなりますか? ループしてしまい、その場所が見つかりません。両方の日付をエポック時間に変換してから比較するために使用できるtimelocalを確認してください。

use Time::Local;
my $temp_epoch = timelocal(0,0,0,$temp_day,$temp_month -1, $temp_year-1900);
if ($epoch < $temp_epoch ) {
    ...
}
于 2011-08-02T12:37:15.007 に答える
2

シークアンドテルは巻き戻しの問題を解決します。現在存在する行を上書きすることになります。怠惰な解決策は、Tie::Fileを使用することです。別の可能性として、新しいバージョンを書き出す間にファイルを読み取り、完了したら古いバージョンを新しいバージョンに置き換えます。

于 2011-08-02T12:20:14.600 に答える
0

標準的な perl の解決策は、問題にメモリを投入することです。

open( 私の $FILE, ....); #読み取り/書き込みモードで開く
私の @lines = <FILE>; # ファイルのすべての行を丸呑みする
... 配列に挿入 (または削除?) ...
切り捨て ( $FILE, 0 ); #削除する場合は切り詰める必要があります
シーク ( $FILE, 0, 0 );
$FILE @lines を印刷します。

より効率的にするには、すべてではなく変更点から書くこともできますが、速度が重要でない場合は、単純な方がバグの可能性が低くなります。

于 2011-08-02T11:30:47.527 に答える