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它可以让您将文件视为数组;按行号访问行(自动写入换行符)。

#!/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在同一个文件句柄上使用会自动关闭它。
  • 我使用三参数 open 和一个词法(由 定义my)文件句柄,这是推荐的方式。
  • 打印以逐行模式读取的变量时,您不需要添加换行符,因为它最后已经有了换行符。或文件结束。
  • 您可以使用print <$fh>,因为 print 语句在列表上下文中,它将从文件句柄中提取所有行(打印整个文件)。

如果你只想打印一行,你可以这样做:

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