如何覆盖文件

时间:2017-05-28 14:53:02

标签: regex perl

我尝试学习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并将结果写入原始文件。

也许我错过了什么。

3 个答案:

答案 0 :(得分: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: $!

答案 1 :(得分:0)

Perl通常不支持直接访问文件。 最好将更改的内容写入临时文件, 关闭输入和输出文件,并将临时文件重命名为输入。

或者,如果这是唯一你想做的事,你可以使用 一个单行命令,如:

perl -p -i -e "s/is/at/" -- apple.txt

大致相同。

或者,如果您非常想要对此操作进行编程 在你自己,然后:

  • 访问 perldoc.perl.org/perlrun.html 页面,
  • 找到-i[extension]选项的说明,
  • 在单词之后,相当于,您将找到等效的Perl代码。

关于你的代码的评论:

open (FILE, '>>apple.txt');

打开文件,当前位置指针位于文件末尾, 所以 print 命令添加文本,而不是覆盖文件 从一开始。

答案 2 :(得分: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;