用perl覆盖文件

时间:2013-12-07 16:55:32

标签: perl

如何使用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;
}

2 个答案:

答案 0 :(得分:4)

  1. chomp $username,而不是$line,因此$username永远不会等于$line

  2. chomp要添加新评论,但在最后一个循环中,您打印时没有换行符。因此,您打印的任何新评论都会将文件放在其后的任何行上。

  3. 您的elsif ($addCommentNow eq 1) {将丢弃当前缓冲区或根据输入做其他奇怪的事情。

  4. 尝试修改后的代码(仅解决这三个问题):

    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);

当然,打开它进行读/写(使用"+<")。