2016-05-16 4 views
1

こんにちは私は既存の.txtファイルに新しいデータ行を追加したいと思います。私は以下のスクリプトを使用します。それは新しい行を追加しましたが、一番下に追加されました。既存の行の先頭に新しい行を追加したいと思います。どうやってやるの?既存の.txtファイルの先頭に新しい行を追加する方法はありますか?

my $filename = 'file.txt'; 
open(my $fh, '>>', $filename) or die "Could not open file '$filename' $!"; 
print $fh "-----------\n"; 
close $fh; 
+0

小さなファイルまたは非常に大きなファイルを? – zdim

+0

小さなファイル。ありがとう。 –

+0

これはWindowsまたはLinuxでですか? – Borodin

答えて

2

ファイルを書き直す必要があります。内容を変更するには、変更されている部分を過ぎて残りのファイルが最初に保存され、次に新しい内容の後にコピーされる必要があります。 (新しいコンテンツは、置換するバイト数と同じバイト数を持つことは非常にまれですので、単一の文字を正確に上書きしない限り)。挿入すると、さらに真ん中にバイトを追加することはできません。または最初に。 >>は、が付加されたファイルを開きます.をその後ろに追加します。

十分に小さいファイルの場合

use warnings; 
use strict; 

my $filename = 'file_to_prepend_to.txt'; 
my @lines_to_prepend = ("line 1", "line 2"); 

# slurp the whole file into a variable 
my $filecont = do { 
    local $/; 
    open my $fh, '<', $filename or die "Can't open $filename: $!"; 
    <$fh>; 
}; 

# open the file for writing, to overwrite 
open my $fh, '>', $filename or die "Can't open $filename: $!"; 

# write new contents first 
for my $line (@lines_to_prepend) { 
    print $fh "$line\n"; 
} 

# dump the old contents now 
print $fh $filecont; 
close $fh; 

<>はすべての方法最後まで読み込み、ファイル全体を文字列として返され、スカラに割り当てられるようにlocal $/undefに入力レコードの区切りを設定します。ブロックdoが完了すると、ファイルハンドルは閉じられます。 printの中に\nがあることに注意してください。改行を追加してください。あなたの行からprepepndに既にそれが削除されていれば。

非常に大きなファイルの場合は、行単位で読み込んで新しいファイルに書き出してから、元のファイルに上書きする必要があります。たとえば、コアのFile::Tempモジュールを使用するなどして、一時ファイルの名前が既存ファイルと一致しないようにすることをお勧めします。

+0

ありがとうございました。 –

+0

@meemeeすばらしい:)コメントがあれば教えてください。 – zdim

1

コアモジュールTie :: Fileを使用してファイルを配列のように使用することをお勧めします。

このような単純なタスクのためのモジュールを使用すると、過剰使用のように見えるかもしれませんが、Tie :: Fileは非常に使いやすく、ファイルが大きくなり過ぎるのを心配する必要はなくなりました。

私は通常、このような何か:

use strict; 
use warnings; 
use Tie::File; 

my $file_name  = 'file_to_prepend_to.txt'; 
my @lines_to_prepend = ("Prepended line 1", "Prepended line 2"); 

my @file_as_array; 

tie @file_as_array, 'Tie::File', $file_name or 
    die "Unable to tie to file $file_name: $!\n"; 

unshift @file_as_array, @lines_to_prepend; 

untie @file_as_array; 
関連する問題