我的搜索和替换无效,也没有任何错误。
我尝试修改代码并在其工作的地方提供输入。我不确定错误发生在哪里。
#!/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;
};
答案 0 :(得分:2)
我认为你已经厌倦了这么多不必要的use
语句,调用了字符串常量var1
,var2
等等,搞砸了从未使用过的$VAR
,并在没有尾随换行符的变量上调用chomp
我已经重写了你的代码,以便我可以看到它做了什么,并且它工作正常
它会在整个文件中将$s2
(var2
)的值替换为$s1
(var1
)的值。每个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 更少的内存。