如何在perl中更改文件中的内容?

时间:2017-11-24 04:35:56

标签: perl file

我试图一次打开一个文件读取oneline然后打开另一个文件并尝试搜索从第二个文件中的第一个文件读取的行的某些部分并尝试用另一个文件替换所有实例从第一个文件读取的行的一部分。当我执行它时它被执行,我能够在控制台上看到结果,但文件没有得到修改。可能是什么错误。有人可以建议一下。

use strict;
use warnings;
use autodie; # die if problem reading or writing a file

my $filename = 'compare.txt';
open(my $fh, '+<', $filename) or die "Could not open file '$filename' $!";



while(<$fh>){
    my $readline= "$_";

    print("\n");

    my @arr=split(',',$readline);
    print($arr[0]."\n".$arr[1]);
    replace($arr[0],$arr[1]);

}
close $fh;

sub replace
{
    my $search=shift(@_);
    my $replace=shift(@_);

    my $filename2 = 'replace.txt';
    open(my $fh1, '+<', $filename2) or die "Could not open file '$filename' $!";

    while(<$fh1>)
    {
        my $readline2= "$_";
        $readline2=~s/$search/$replace/g;
        print($readline2);
        print("\n");

   }
   close $fh1;

}

2 个答案:

答案 0 :(得分:2)

作为Path::Tiny模块的忠实粉丝,我会将上述内容作为:

use 5.014;
use warnings;
use Path::Tiny;

my %rep = map { split /,/ } path('compare.txt')->lines({chomp => 1});
path("replace.txt")->edit_lines( sub {
    while(my($key,$val) = each(%rep)) {
        s/$key/$val/g;
    }
});

答案 1 :(得分:1)

在您的子文件中,当您在文件中迭代行时,应将其写回文件。正则表达式替换不会自动将其写回文件。

use strict;
use warnings;
use autodie; # die if problem reading or writing a file
use File::Copy;
my $filename = 'compare.txt';
open(my $fh, '+<', $filename) or die "Could not open file '$filename' $!";



while(<$fh>){
        my $readline= "$_";

        print("\n");

        my @arr=split(',',$readline);
        print($arr[0]."\n".$arr[1]);
        replace($arr[0],$arr[1]);

}
close $fh;

sub replace
{
        my $search=shift(@_);
        my $replace=shift(@_);

        my $filename2 = 'replace.txt';
        open(my $fh1, '+<', $filename2) or die "Could not open file '$filename' $!";
#open file to write to
        open $newfile, '>', 'replace_tmp.txt';
        while(<$fh1>)
        {
                chomp;
                my $readline2= "$_";
                $readline2=~s/$search/$replace/g;
                print( $newfile, $readline2);
                print($newfile, "\n");
        }
        close($fh1);
        close($newfile);
        move ('replaced.txt', 'replace.txt');
}

这是一种简单的方法。您可以使用File::Tie回写同一文件并避免重命名,或参考perldoc