如何使用Perl覆盖带有数组的文件?
我的文件如下:
username1
comment
comment
comment
username2
comment
comment
username3
comment
comment
comment
...
我所做的是先将线条加载到数组中。然后通过数组添加行到新数组。当它找到我想要添加注释的用户行时,将触发一个标志,使其在循环的下一个增量处添加注释。之后,它只是将其余的行添加到数组中。我想做什么然后它使用新数组来覆盖文件。这就是我被困住的地方。
sub AddComment() {
my $username = shift; # the username to find
my $comment = shift; # the comment to add
chomp($comment);
chomp($username);
open my $COMMENTS, '<', "comments.txt" or die "$!"; #open the comments file
my @lines = <$COMMENTS>; #Make an array of the files lines
my @NewCommentsFile; # make an array to store new file lines
my $addCommentNow = 0; # flag to know when to add comment
for my $line (@lines) {
if ($line eq $username) { # if this line is the username
$addCommentNow = 1; # set flag that next line you add comment
push(@NewCommentsFile, $line); # add this line to new array
}
elsif ($addCommentNow eq 1) { # if the flag is 1 then do this
push(@NewCommentsFile, $comment); # add the comment to the array
$addCommentNow = 0; # reset flag
}
else {
push(@NewCommentsFile, $line); #add line to array
}
}
open my $fh, '>', "comments.txt" or die "Cannot open output.txt: $!";
# Loop over the array
foreach (@NewCommentsFile) {
print $fh "$_"; # Print each entry in our new array to the file
}
close $fh;
}
答案 0 :(得分:4)
您chomp
$username
,而不是$line
,因此$username
永远不会等于$line
。
您chomp
要添加新评论,但在最后一个循环中,您打印时没有换行符。因此,您打印的任何新评论都会将文件放在其后的任何行上。
您的elsif ($addCommentNow eq 1) {
将丢弃当前缓冲区或根据输入做其他奇怪的事情。
尝试修改后的代码(仅解决这三个问题):
for my $line (@lines) {
chomp $line;
push(@NewCommentsFile, $line);
push(@NewCommentsFile, $comment) if $line eq $username;
}
open my $fh, '>', "comments.txt" or die "Cannot open output.txt: $!";
foreach (@NewCommentsFile) {
print $fh "$_\n"; # Print each entry in our new array to the file
}
close($fh);
答案 1 :(得分:2)
不要打开文件两次。 只需使用seek来开始它:
seek($COMMENTS, 0, 0);
当然,打开它进行读/写(使用"+<"
)。