我正在尝试用文本填充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是登录的用户。
感谢任何帮助!
答案 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>