gpt4 book ai didi

linux - linux下perl的基本聊天系统

转载 作者:IT王子 更新时间:2023-10-29 00:41:34 26 4
gpt4 key购买 nike

我正在尝试编写一些基本的聊天系统来学习 perl。我正在尝试将聊天记录放入 1 文件并打印新消息(如果它出现在 chatlog.dat 中)文件,所以我写了一个几乎做同样事情的函数,但我遇到了一些问题,不知道如何解决。所以现在我有两个问题!

  1. 我不明白如何保留 checkFile功能始终处于事件状态(如多处理)以持续检查新消息

  2. 当我尝试编写一条将附加到聊天记录中的新消息时,会出现此问题。解释器在 my $newMessage = <STDIN>; 行等待我的输入,但是,如果有人写了一条新消息怎么办?在他按下 enter 之前它不会显示...如何取消它?

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

最佳答案

首先:

  • 不要使用 echo在 perl 脚本中。当您拥有非常好的 IO 例程时,shell 转义是令人讨厌的。

  • 使用 cat读取文件与使用“回声”一样令人讨厌。

  • 阅读 <STDIN>这样将是一个阻塞调用 - 这意味着您的脚本将暂停。

  • 但这并不像听起来那么糟糕,因为否则您将运行一个“忙等待”循环,该循环将重复 cat文件。这是一个非常糟糕的主意。

  • 您假设编写这样的文件是原子操作,但事实并非如此。这样做也会遇到问题。

我建议您查看 IO::Handle并考虑使用 flock以确保您已为 IO 锁定文件。您不妨考虑 File::Tail反而。

不过我实际上建议您考虑使用不同的 IPC 模式——因为“文件交换”效率很低。如果您真的想为您的 IO 使用文件系统,您可能需要考虑使用 FIFO 管道 - 让每个“客户端”打开它自己的,并让服务器读取和合并它们。

无论哪种方式 - 你要么需要使用 IO::Select或者多线程,只是为了在读写之间来回切换。 http://perldoc.perl.org/IO/Select.html

关于linux - linux下perl的基本聊天系统,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26104781/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com