2017-05-28 116 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); 
} 

我想所有is改变at并将结果写入到原始文件。

也许我错过了什么。

+0

欢迎StackOverflow上。 请参考[游览], 学习问好问题stackoverflow.com/help/how-to-ask, 做个[mcve]。 提供更多关于错误的信息,如何。即提供当前结果与期望的结果进行比较。 – Yunnosch

+1

你可能想要'/ g'修饰符。你也想打开你的文件阅读。你用追加写入模式'>>'打开它。你正在使用什么样的教程或书籍? – simbabque

+0

@simbabque我刚刚在网上找到一些教程。我曾经阅读这本书,但对我没有用处。 – Darentina

回答

4

如果你要花费任何时间在Perl编程时间,那么花费时间阅读Perl FAQ是非常值得的。第4节中回答的其中一个问题在这里似乎很有用。

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

答案开始是这样的:

插入,更改或从文本 文件删除线的基本思想包括阅读和打印文件到您想要点 进行更改,进行更改,然后读取并打印文件的其余部分 。 Perl不提供对行的随机访问(尤其是 ,因为记录输入分隔符$/是可变的),尽管模块 (如Tie::File)可以伪造它。

一个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()的三参数版本和词法文件句柄 - open my $file_handle, '>>', 'apple.txt'
  • 您应该始终检查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;