perl脚本中的读写操作

时间:2012-06-05 18:19:27

标签: linux perl

我是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

为什么我无法阅读内容。我的代码是错还是错过了什么。

2 个答案:

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

如果您只想打印一行,可以执行以下操作:

print scalar <$fh>;  # put <$fh> in scalar context