文件搜索并替换为Tie :: File

时间:2016-06-07 17:53:51

标签: perl

我的搜索和替换无效,也没有任何错误。

我尝试修改代码并在其工作的地方提供输入。我不确定错误发生在哪里。

#!/usr/bin/perl

use strict;
use warnings;
use diagnostics;

use Tie::File;
use v5.10;
use File::Compare;

my $VAR; $VAR=$ARGV[0];chomp $VAR;

my $nam=qq~file_name~;

my @lines;

our $s1="var1";
our $s2="var2";

if ('$s1' ne '$s2'){
    replace();
}

sub replace {

    chomp $s1;chomp $s2;

    tie @lines, 'Tie::File', "$nam" or die " can't open the file\n";

    foreach ( @lines ) {
        s/$s2/$s1/g; # replacing the strings
    }

    untie @lines;
};

2 个答案:

答案 0 :(得分:2)

我认为你已经厌倦了这么多不必要的use语句,调用了字符串常量var1var2等等,搞砸了从未使用过的$VAR ,并在没有尾随换行符的变量上调用chomp

我已经重写了你的代码,以便我可以看到它做了什么,并且它工作正常

它会在整个文件中将$s2var2)的值替换为$s1var1)的值。每个var2都更改为var1

#!/usr/bin/perl

use strict;
use warnings 'all';

use Tie::File;

my $name = 'file_name.txt';

my ($s1, $s2) = qw/ var1 var2 /;

if ( $s1 ne $s2 ) {

    tie my @lines, 'Tie::File', $name or die qq{Can't open "$name" the file: $!};

    s/$s2/$s1/g for @lines;
}

答案 1 :(得分:-1)

Tie :: File很少有帮助。如果您要使用绑定文件执行for (@lines),那么您将会使事情变得非常缓慢,并且如果您没有使用Tie ::那么您可以使用更多的内存文件。

#!/usr/bin/perl

use strict;
use warnings;

@ARGV = 'file_name';
$^I = '';   # Like the -i command line option

while (<>) {
   s/var2/var1/g;
   print;
}

这与做

基本相同
perl -i -pe's/var2/var1/g' file_name

如果无法创建文件,那么我将使用以下内容:

#!/usr/bin/perl

use strict;
use warnings;
use autodie;

my $qfn = 'file_name';

my @lines;
{
   open(my $fh, '<', $qfn);
   @lines = <$fh>;
}

{
   open(my $fh, '>', $qfn);
   s/var2/var1/g for @lines;
   print($fh @lines);
}

这种方式比使用Tie :: File更快,比IIRC快30倍。与使用Tie :: File相比,它还使用 way 更少的内存。