2

私はPerlスクリプトの初心者です。

ファイルに対して読み取りおよび書き込み操作を実行したい。ファイルを読み書きモード (+<) で開き、ファイルに書き込みます。ここで、以前に書き込んだファイルを読みたいと思います。以下は私のコードです:

#!/usr/bin/perl

`touch file.txt`; #Create a file as opening the file in +< mode
open (OUTFILE, "+<file.txt") or die "Can't open file : $!";

print OUTFILE "Hello, welcome to File handling operations in perl\n"; #write into the file

$line = <OUTFILE>; #read from the file

print "$line\n"; #display the read contents.

読み取った内容を表示すると、空白行が表示されます。しかし、ファイル「file.txt」にはデータがあります

Hello, welcome to File handling operations in perl

内容が読めないのはなぜですか?私のコードが間違っているか、何か不足していますか。

4

2 に答える 2

5

問題は、ファイルハンドルの位置が、記述した行の後にあることです。機能を使用してseek、「カーソル」を先頭に戻してから、再度読み取ります。

いくつかの追加コメントを含む例:

#!/usr/bin/env perl

# use some recommended safeguards
use strict;
use warnings;

my $filename = 'file.txt';
`touch $filename`;

# use indirect filehandle, and 3 argument form of open
open (my $handle, "+<", $filename) or die "Can't open file $filename : $!";
# btw good job on checking open sucess!

print $handle "Hello, welcome to File handling operations in perl\n";

# seek back to the top of the file
seek $handle, 0, 0;

my $line = <$handle>;

print "$line\n";

Tie::File多くの読み取りと書き込みを行う場合は、ファイルを配列のように扱うことができる which を使用してみてください (誰もが推奨しているわけではありません) 。行番号による行アクセス (自動的に改行が書き込まれます)。

#!/usr/bin/env perl

# use some recommended safeguards
use strict;
use warnings;

use Tie::File;

my $filename = 'file.txt';
tie my @file, 'Tie::File', $filename
  or die "Can't open/tie file $filename : $!";

# note file not emptied if it already exists

push @file, "Hello, welcome to File handling operations in perl";
push @file, "Some more stuff";

print "$file[0]\n";
于 2012-06-05T18:22:22.650 に答える
0

これは一見よくある初心者の間違いです。ほとんどの場合、同じファイルへの読み取りと書き込みは、可能ではありますが、問題に値しないことがわかります。Joel Berger が言うようseekに、ファイルの先頭に移動できます。ファイルを再度開くこともできます。シークは、行ごとに読むほど簡単ではなく、困難を伴います。

また、事前に空のファイルを作成する必要はありません。単に行う:

open my $fh, ">", "file.txt" or die $!;
print $fh "Hello\n";
open $fh, "<", "file.txt" or die $!;
print <$fh>;

ご了承ください:

  • 同じファイルハンドルで使用openすると、自動的に閉じます。
  • 私は 3 引数の open とレキシカル ( で定義されるmy) ファイル ハンドルを使用します。これは推奨される方法です。
  • 行ごとモードで読み込まれた変数を印刷する場合、改行を追加する必要はありません。これは、最後に既に改行があるためです。またはファイルの終わり。
  • を使用できますprint <$fh>。print ステートメントはリスト コンテキストにあるため、ファイル ハンドルからすべての行を抽出します (ファイル全体を出力します)。

1行だけ印刷したい場合は、次のようにします。

print scalar <$fh>;  # put <$fh> in scalar context
于 2012-06-05T18:35:34.973 に答える