文件" / root / actual"是不是用#34; / root / temp"的内容写的。通过perl脚本。如果手动编辑" / root / actual"正在修改。
copy("/root/actual","/root/temp") or die "Copy failed: $!";
open(FILE, "</root/temp") || die "File not found";
my @lines = <FILE>;
close(FILE);
my @newlines;
foreach(@lines) {
$_ =~ s/$aref1[0]/$profile_name/;
push(@newlines,$_);
}
open(FILE, ">/root/actual") || die "File not found";
print FILE @newlines;
close(FILE);
答案 0 :(得分:1)
文件“/ root / actual”没有通过perl脚本覆盖“/ root / temp”的内容。如果手动编辑“/ root / actual”正在修改。
您的意思是/root/temp
没有被/root/actual
取代吗?或者/root/temp
是否可以根据需要进行修改,但是在程序结束时不会复制/root/acutual
?
我建议您阅读现代Perl编程实践。您需要在程序中使用use warnings;
和use strict;
。事实上,除非使用use strict;
和use warnings;
,否则此论坛上的许多人都不会费心回答Perl问题。
$aref1[0]
来自哪里?我没有看到你的程序中任何地方声明了@aref1
。或者,就此而言$profile_name
。
如果您正在将整个文件读入正则表达式,则没有理由首先将其复制到临时文件中。
我用更现代的语法重写了你的内容:
use strict;
use warnings;
use autodie;
use constant {
FILE_NAME => 'test.txt',
};
my $profile_name = "bar"; #Taking a guess
my @aref1 = qw(foo ??? ??? ???); #Taking a guess
open my $input_fh, "<", FILE_NAME;
my @lines = <$input_fh>;
close $input_fh;
for my $line ( @lines ) {
$line =~ s/$aref1[0]/$profile_name/;
}
open my $output_fh, ">", FILE_NAME;
print ${output_fh} @lines;
close $output_fh;
这很有效。
use autodie;
表示您无需检查文件是否已打开。for
循环时,我可以在数组中执行 inplace 替换。每个项目都是指向数组中该条目的指针。copy
或临时文件,因为您无论如何都要替换原始文件。map { s/$aref1[0]/$profile_name/ } @lines;
可以替换for
循环。见map。