我是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
为什么我无法阅读内容。我的代码是错还是错过了什么。
答案 0 :(得分: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
,它可以让你像处理数组一样处理文件;按行号访问行(自动写入换行符)。
#!/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";
答案 1 :(得分:0)
这是一个看似常见的初学者错误。大多数情况下,您会发现尽可能读取和写入同一文件并不值得。正如Joel Berger所说,你可以seek
到文件的开头。您也可以简单地重新打开该文件。寻求并不像逐行阅读那样简单,并且会给你带来困难。
另外,您应该注意,不需要事先创建空文件。只需:
open my $fh, ">", "file.txt" or die $!;
print $fh "Hello\n";
open $fh, "<", "file.txt" or die $!;
print <$fh>;
请注意:
open
会自动关闭它。 my
定义)文件句柄,这是推荐的方式。print <$fh>
,因为print语句在列表上下文中,它将从文件句柄中提取所有行(打印整个文件)。 如果您只想打印一行,可以执行以下操作:
print scalar <$fh>; # put <$fh> in scalar context