加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > Linux > 正文

linux下perl上的基本聊天系统

发布时间:2020-12-14 01:43:32 所属栏目:Linux 来源:网络整理
导读:我试着写一些基本的聊天系统只是为了学习perl.我试图将聊天记录变成1个文件并打印新消息,如果它出现在chatlog.dat文件中,所以我写了一个功能几乎完全相同的东西,但我有一些问题,不知道如何解决它们. 所以现在我有2个问题! 我无法理解如何使checkFile函数始
我试着写一些基本的聊天系统只是为了学习perl.我试图将聊天记录变成1个文件并打印新消息,如果它出现在chatlog.dat文件中,所以我写了一个功能几乎完全相同的东西,但我有一些问题,不知道如何解决它们.
所以现在我有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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读