如何在perl中将内容写入文件

时间:2013-12-28 23:39:29

标签: perl file-handling

当我尝试将内容写入文件时,文件变回空白。不知道这里发生了什么。我知道正则表达式正在运行。我怀疑问题与我写文件的方式有关。

#!/usr/bin/perl
@files = </home/vnc/Downloads/test/*.json>;
my $myfile;
foreach $file (@files) {
    print $file . "\n";
    open(IN,'<',$file) or die $!;
    while(<IN>) {
        $_ =~ s/^(.*?)\[//;
        $_ =~ s/\](?=[^.]*$)//;
        $myfile = $_;
        # print $myfile;
    }
    close(IN);
    open(OT,'>',$file) or die $!;
    while(<OT>) {
        print(OT $myfile);
    }
    close(OT);
    # $file =~ s/^(.*?)\[//;
} 

2 个答案:

答案 0 :(得分:1)

据我了解,你的做法是错误的。您使用正则表达式替换某些内容时处理整个文件,但您没有将其写入任何位置。稍后你以写模式打开一个文件,但循环没用,因为它是空的。

在我看来,处理这种情况的最简单方法是使用修改文件的$^I变量。这里有一个例子作为一个班轮(未测试):

perl -i.bak -pe 's/^(.*?)\[//; s/\](?=[^.]*$)//' /home/vnc/Downloads/test/*.json

答案 1 :(得分:1)

要从perl脚本中就地修改文件列表,您也可以使用此方法。文件内容加载到数组@content,修改后写入原始文件:

#!/usr/bin/perl

use strict;

# Example: Modifying a list of files in-place within a perl script

foreach my $file (</home/vnc/Downloads/test/*.json>) {
    # Open read-write (+<)
    open my $f, "+< $file" or die "$!\n";

    # read the lines:
    my @content = <$f>;

    # change the lines:
    @content = map { s/foo/bar/; $_ } @content;

    # empty the file
    truncate $f, 0;

    # rewind to beginning of file
    seek $f, 0, 0;

    # print new content to file
    print $f @content;

    close $f;
}