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

Perl 文件搜索并替换为Tie::File,perl,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";

我的搜索和替换不起作用,也没有抛出任何错误

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

#!/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;
};

我想你已经被这么多不必要的
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;
}

Tie::文件很少有帮助。如果您要使用绑定文件为(@lines)执行
,您将使事情变得极其缓慢,并使用比不使用Tie::file更大的内存

#!/usr/bin/perl

use strict;
use warnings;

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

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

如果创建文件不是一个选项,那么我将使用以下选项:

#!/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);
}
#/usr/bin/perl
严格使用;
使用警告;
使用自动模具;
我的$qfn='文件名';
我的@行;
{
打开(我的$fh,,$qfn);
适用于@线的s/var2/var1/g;
打印(fh@行);
}

这种方式比Tie::File快30倍,IIRC。它使用的内存也比Tie::File少得多。

请删除
>
字符。另外,Perl中的注释以
#
开头,而不是
/*
“$nam”
$nam
@choroba同样
“$s1'ne'$s2'
$s1-ne$s2
不同。第一个总是正确的,事实并非如此。它只是防止打印长的诊断信息。从功能上讲,它不会改变任何东西。@stevieb:my$VAR的行
my$VAR$VAR=$ARGV[0];chomp$VAR没有任何区别,只是它会吐出一堆诊断文本。它可以留在原地,程序可以正常运行。实际上,如果sting作为参数输入,上面的代码可以工作,但它可以工作,在这里,我使用下面的命令$s1=“system(\”,使用另一个文件和当前文件之间的差异的i/pcd\$DIR/floder\$grep$VAR*| awk-F'{print\$NF}'| head-1\”;它的o/p类似于-var“where-&”,也与变量#/usr/bin/perl-w use strict一起出现;使用警告;使用诊断;使用Tie::文件;我的$nam;我的@行;打印“输入文件名:\n”$nam=;咀嚼$nam;替换();sub replace{my$s1;my$s2;print“输入要替换的字符串:\n”;$s1=;print“输入要替换的字符串:\n”;$s2=;chomp$s1;chomp$s2;tie@lines,'tie::File',“$nam”或die“无法打开文件”\n;foreach(@lines){s/$s1/$s2/g}unte@lines;};值得注意的是,
$^I
是就地编辑扩展。设置它意味着就地编辑文件(本例中为“文件名”)。它与perl-p-i-e的s/var2/var1/g;'文件名
。普通的replace/sed/perl命令replace对我的情况不起作用,因为我正在编辑的目录没有写权限,但我正在编辑的文件有写权限。嗨,谢谢你,杜德,我已经为我的函数修改了你的脚本,但该字符串有4次出现,但只修改了第4次出现,前3种情况没有修改,你能帮我一下吗?我使用了与你在“如果创建文件不是一个选项,那么我会使用以下代码:”中给出的相同代码,然后前3种情况由于某种原因不匹配。我没有看到你的模式或你的输入,所以我不能帮你。不过,这听起来像是一个单独的问题,因为它与您如何读取数据无关(除非您期望的匹配跨越行)。感谢Dude,我已经将chomp添加到我的字符串变量中,现在所有字符串都被替换了。。。。
#!/usr/bin/perl

use strict;
use warnings;

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

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