Perl—读取文件并将数据追加到已存在的行中

Perl—读取文件并将数据追加到已存在的行中,perl,file,csv,append,Perl,File,Csv,Append,我有一个只包含一行的.csv文件。假设文件名为new.csv,其中的行是>abc、add、aer、adfw、asdf 现在我尝试读取这个文件,然后尝试通过像这样写入同一个文件来附加另一个数据 open(FH , '+<' , "") or die "Cannot open the file : $!" while(<FH>){ chomp($_); print FH ", new_data"; } close(FH) 打开(FH,'+ 即使我在$上使用了ch

我有一个只包含一行的.csv文件。假设文件名为new.csv,其中的行是>abc、add、aer、adfw、asdf

现在我尝试读取这个文件,然后尝试通过像这样写入同一个文件来附加另一个数据

open(FH , '+<' , "") or die "Cannot open the file : $!"
while(<FH>){
    chomp($_);
    print FH ", new_data"; 
}
close(FH)
打开(FH,'+
即使我在$上使用了chomp

在您的情况下,
$\uu
是当前输入行的内存副本,因此
chomp
不会更改输入文件的相应行

一种就地更改文件的方法是使用
Tie::file
,它将常规文件绑定到一个数组,因此您可以通过更改该数组来修改该文件

以下是一个例子:

#!/usr/bin/perl

use strict;
use warnings;

use Tie::File;

my $file = 'new.csv';

tie my @line, 'Tie::File', "$file" or die "Cannot tie $file: $!";

$line[0] .= ', new_data';

untie @line;

一般来说,最好将输出写入一个新文件,因为同时读取和写入同一个文件会有很多问题

但是,对于包含单行文本的文件,可以相对安全地执行此操作

这个程序说明了这一点。调用
seek
可以将指针移回文件的开头,否则指针将指向文本行的末尾,这就是为什么您自己的尝试在保留行时,其尾随新行仍保持不变

truncate
调用用于清空文件,从而使操作更安全。如果文件中的任何内容位于第一行之后,则会将其删除

use strict;
use warnings;

open my $fh, '+<', 'myfile.csv' or die "Cannot open the file: $!";
my $line = <$fh>;
chomp $line;

seek $fh, 0, 0;
truncate $fh, 0;

print $fh $line, ",new_data\n"; 
close $fh;
abc,add,aer,adfw,asdf,new_data