我试着写一些基本的聊天系统只是为了学习perl.我试图将聊天记录变成1个文件并打印新消息,如果它出现在chatlog.dat文件中,所以我写了一个功能几乎完全相同的东西,但我有一些问题,不知道如何解决它们.
所以现在我有2个问题!
所以现在我有2个问题!
>我无法理解如何使checkFile函数始终处于活动状态(如multiprocession)以持续检查新消息
>当我尝试编写将附加到聊天记录中的新消息时,会出现此问题.解释器在我的$newMessage =< STDIN>;行等待我输入,但是,如果有人写了新消息怎么办?直到他按下进入才会显示…如何取消?
my ($sec,$min,$hour) = localtime(); while(1){ my $userMessage = <STDIN>; last if $userMessage eq "::quit"; `echo "($hour:$min:$sec): $userMessage" >>chatlog.dat`; } sub checkFile{ my $lastMessage = ""; my $newMessage = ""; while (1) { my $context = `cat chatlog.dat`; split(/\n/,$context); $newMessage = $_[$#_]; if ($newMessage ne $lastMessage) { print $newMessage; $lastMessage = $newMessage; } } }
解决方法
第一:
>不要在perl脚本中使用echo.当你有完美的IO例程时,它很难逃脱.
>使用cat来读取文件与使用’echo’一样令人讨厌.
>阅读< STDIN>这将是一个阻塞调用 – 这意味着你的脚本将暂停.
>但这并不像它听起来那么糟糕,因为否则你正在运行一个“忙等待”循环,它会重复捕捉文件.这是一个非常糟糕的主意.
>你假设写一个像原子操作的文件,当它不是时.你也会遇到这样的问题.
我建议你看看IO :: Handle,并考虑使用flock来确保你已经为IO锁定了文件.您可能还希望考虑File :: Tail.
我实际上建议,你想考虑一种不同的IPC模式 – 因为’文件交换’是非常低效的.如果您真的想要为IO使用文件系统,您可能需要考虑使用FIFO管道 – 让每个“客户端”打开它自己的,并让服务器读取并合并它们.
无论哪种方式 – 您需要使用IO :: Select或者多线程,只需在读写之间来回切换. http://perldoc.perl.org/IO/Select.html