0

perlを使用して既存のファイルの読み取りと書き込みを行いたい。

誰かが私がそのような目的のために使用しなければならないモードが何であるかを教えてもらえますか:私は利用可能な以下のモードにかなり混乱しています。試してみまし+>たが、ファイルに書き込みませんでした。

mode operand create truncate 
read     <   
write    >    ✓      ✓ 
append  >>    ✓  

mode       operand create truncate 
read/write  +<   
read/write  +>       ✓      ✓ 
read/append +>>      ✓  

例:私は以下のようなファイルを持っています:

one
two 
four

私は次のように間に線を挿入したい:

one
two
three
four
4

3 に答える 3

2

読み取りと書き込みの混合perlopentutについて何を言っているか見てみましょう。結論として、混合モードのオープンモードはどれも理想的ではなく、インプレース編集モード(を使用)の方が優れたソリューションです。$^I

この特定の問題についてはTie::File、ファイルを単純な配列として扱うことができるモジュールをお勧めします。

three例として、サンプルデータに行を挿入するには、次のように記述します。

use strict;
use warnings;

use Tie::File;

tie my @file, 'Tie::File', 'myfile.txt' or die $!;

splice @file, 2, 0, 'three';

untie @file or die $!;
于 2012-08-22T11:58:55.390 に答える
1

perldoc foropenから、2つの差し迫った問題があります。

+ <は、ほとんどの場合、読み取り/書き込みの更新に適しています。+>モードでは、最初にファイルが上書きされます。

テキストファイルには可変長のレコードがあるため、通常、どちらの読み取り/書き込みモードを使用してテキストファイルを更新することはできません。

より一般的には、ファイルの途中にデータを挿入しようとすると設計上の問題が発生します。テキストファイルはそのようには機能しません。これを行う最も簡単な方法は次のいずれかです。

  1. ファイル全体をメモリに読み込み、変更を加えてファイルを書き込みます
  2. 入力ファイルを1行ずつ読み取り、変更を加えて別のファイルに出力を書き込みます。次に、元のファイルを削除し、新しいファイルの名前を古い名前に変更します。

1)が最も単純ですが、2)ファイルが巨大な場合は、メモリ効率が高くなります。

編集:Perlがファイルをインプレースで編集できるようにする-iスイッチもあります。これは、2)を舞台裏で実装することによって行われます。しかし、私は個人的にそれを自分でやることに固執したいと思います。これは、価値があるよりも混乱しているようです。

于 2012-08-22T09:33:08.537 に答える
1

データを移動する必要があるため、ファイルのインプレース挿入は少し難しい場合があります。別の方法で目的を達成する方法については、 dan1111回答を参照してください(これが推奨されます)。

ただし、インプレース挿入のために:

#!/usr/bin/env perl

use strict;
use warnings;

my $file = 'input';
open my $fh, '+<', $file or die "Failed to open $file: $!";

my $pos, @remaining_lines;
while (<$fh>) {
    if ($pos) {
        push @remaining_lines, $_;
    }
    elsif (m{^two$/$}) {
        $pos = tell;
    }
}

my $word = 'three';
seek $fh, $pos, 0;
print $fh $word, $/, @remaining_lines;
于 2012-08-22T09:56:19.210 に答える