文件没有被复制到perl中

时间:2014-10-14 12:16:11

标签: perl unix file-io

文件" / 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);

1 个答案:

答案 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;

这很有效。

注意:

  1. use autodie;表示您无需检查文件是否已打开。
  2. 当我使用for循环时,我可以在数组中执行 inplace 替换。每个项目都是指向数组中该条目的指针。
  3. 无需copy或临时文件,因为您无论如何都要替换原始文件。
  4. 我没有在这里使用它,因为你没有,但map { s/$aref1[0]/$profile_name/ } @lines;可以替换for循环。见map