2017-05-28 18 views
-1

私はPerlを学び、いくつかの問題を抱えています。私は元のファイルを上書きしようとしましたが、動作しませんでした。私を助けてください。ファイルを上書きする方法

#!/usr/bin/perl -w 

use diagnostics; 
use warnings; 
use strict; 

open (FILE, '>>apple.txt'); 
while (<FILE>){  
    s/is/at/; # Substitute 'is' for 'at' 
    print FILE; 
    close (FILE); 
} 

私はatにすべてisを変更すると、元のファイルに結果を書き込もうとしました。

多分私は何かを逃した。

+0

はStackOverflowのへようこそ。 [ツアー]を取ってください。 よくある質問stackoverflow.com/help/how-to-ask、 [mcve]を作成してください。 何がうまくいかないか、どのように情報が得られるかについて詳しく説明します。私。所望の結果と比較して現在の結果を提供する。 – Yunnosch

+1

おそらく '/ g'修飾子が必要です。また、ファイルを開いて読んでみたいです。あなたは追加モード '>'でそれを開きました。どのようなチュートリアルや本を使用していますか? – simbabque

+0

@simbabque私はちょうどインターネットでいくつかのチュートリアルを見つけました。私は本を​​読んでいましたが、それは私には役に立たなかった。 – Darentina

答えて

4

あなたはPerlで時間プログラミングの任意の金額を費やすつもりなら、それはPerl FAQて読むのに時間を取っても価値があるだろう。セクション4で答えられた質問の1つは、ここで役に立つと思われます。

How do I change, delete, or insert a line in a file, or append to the beginning of a file?

答えは次のように起動します:

、挿入、変更、またはテキスト ファイルから行を削除する基本的な考え方は、あなたがしたいポイントにファイルを読み込み、印刷関係 変更を加えて変更し、ファイルの残りの部分を読み取って印刷します。 Perlはラインへのランダムアクセスを提供しない(レコード入力セパレータ、$/ので特に を、可変である)、例えばTie::Fileとしてモジュール が偽ことができるが。これらのタスクを実行する

A Perlプログラムは、 ファイルを閉じ、その行を印刷し、 をファイルを開くの基本的な形をとります。

open my $in, '<', $file  or die "Can't read old file: $!"; 
    open my $out, '>', "$file.new" or die "Can't write new file: $!"; 
    while(<$in>) { 
     print $out $_; 
    } 
    close $out; 

あなたの現在のコードのいくつかのコメント:

  • あなたは-wuse warningsの両方を必要としません。ほとんどの人は後者を使うだけです。 open my $file_handle, '>>', 'apple.txt'から
  • open()と字句ファイルハンドルの3引数バージョンを使用してください。
  • あなたはいつもopen()からの戻り値をチェックし、適切な行動を取る必要があります。多くの場合、人々はこれにdie()を使用します - open my $file_handle, '>>', 'apple.txt' or die "Can't open file: $!
0

Perlは、一般的に、ファイルへの直接アクセスをサポートしていません。 変更された内容を一時ファイルに書き込むことが望ましく、 は入力ファイルと出力ファイルの両方を閉じ、一時ファイルの名前を入力に変更することをお勧めします。

それともこれはあなたがしたい、あなたのような ワンライナーコマンドを使用することができます唯一のものである場合:大体同じことを

perl -p -i -e "s/is/at/" -- apple.txt 

を。

それとも、非常が、その後、自分でこの操作 をプログラムしたい場合:

  • 訪問ページ perldoc.perl.org/perlrun.html、-i[extension]
  • 検索の説明オプション
  • の後にはに相当するPerlコードがあります。

そして、あなたのコードについての発言:

open (FILE, '>>apple.txt'); 

ファイルの最後に現在の位置ポインタでファイルを開き、 ので、任意の印刷コマンドテキストを追加し、最初からファイル を上書きするのではなく、

0

Tie::File要求があるかもしれない行うことができますという名前のモジュールがあります:

use Tie::File; 

my $inputFile = "test.txt"; 

my @array =(); 
tie @array, 'Tie::File', $inputFile || die "Error: Couldn't tie the \"$inputFile\" file: $!"; 
my $len = join "\n", @array; 

if($len=~m/is/) { $len=~s/is/at/g; } 

@array = split/\n/, $len; 
untie @array; 
関連する問題