从perl中的文本文件向textarea写入文本

时间:2013-12-04 20:10:45

标签: perl cgi

我正在尝试用文本填充textarea。 该文本将是用户所做的评论。它将从名为comments.txt

的文件中加载

文件模板是:

 username1
 commentscomments
 commentscomments
 username2
 commentscommentscome
 comchefhjshfhhfjdjdj
 dfhfhjdijedhdjdjdjdj
 username3
 februgusyfvretgtyef

我还有一个名为accounts.txt的文件,用于存储用户名。

我当前的代码只是将整个comments.txt文件写入textarea

  my $username=(param('username')); 
  open my $FHIN, '<', "comments.txt" || die "$!";
  my @fhin = <$FHIN>;
  print textarea(-name=>"CommentArea",-default=>"@fhin",-rows=>10,-columns=>60);

我在想是否应该有一个返回用户注释的字符串数组的子?如果我有一个注释文件的循环,我应该如何构建它,检查每行是否eq用户名,如果是,它会打印每一行,直到它来到另一行匹配accounts.txt上的一行

基本上textarea应该只显示:

 commentscommentscome
 comchefhjshfhhfjdjdj
 dfhfhjdijedhdjdjdjdj

如果username2是登录的用户。

感谢任何帮助!

1 个答案:

答案 0 :(得分:1)

假设您有一个包含所有用户帐户的列表并将其放入哈希中,您可以按照以下步骤进行操作。

sub get_comments {
  my ($username, $filename, $all_users) = @_; # $all_users is a hashref

  open my $FHIN, '<', $filename or die "Cannot open $filename for reading: $!";

  my @comments;
  my $found; # starts out as undef
  while (my $line = <$FHIN>) {
    chomp $line;

    if (exists $all_users->{$line}) {
      last if $found; # stop once we find another user
      if ($line eq $username) {
        $found++;
        next;
      }
    }

    push @comments, $line if $found;
  }
  return \@comments;
}

my $comments = get_comments(param('username'), 'comments.txt', $all_users);
print textarea(
  -name    => "CommentArea",
  -default => join("\n", @{ $comments }),
  -rows    => 10,
  -columns => 60,
);

它会打开您的文件并检查用户名。如果找到我们的用户名,它将在此之后开始保存行,直到找到不同的用户名并停止。文件名是一个参数,因此您不必依赖单个文件,而是可以从config获取(或使用测试文件进行单元测试)。

不需要close文件句柄,因为它将超出范围并在子句末尾隐式关闭。

打印:

<textarea name="CommentArea"  rows="10" cols="60">commentscommentscome
comchefhjshfhhfjdjdj
dfhfhjdijedhdjdjdjdj</textarea>