linux下perl上的基本聊天系统

PYP*_*YPL 5 linux perl chat

我试着写一些基本的聊天系统只是为了学习perl.我试图将聊天记录变成1个文件并打印新消息,如果它出现在chatlog.dat文件中,所以我写了一个功能几乎完全相同的东西,但我有一些问题,不知道如何解决它们.所以现在我有2个问题!

  1. 我无法理解如何保持checkFile功能始终处于活动状态(如多处理)以持续检查新消息

  2. 当我尝试编写将附加到聊天记录中的新消息时,会发生此问题.口译员在线上等待我的输入my $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;
            }
        }
    }
    
    Run Code Online (Sandbox Code Playgroud)

PYP*_*YPL 0

回答我自己的问题

sub checkFile{
    my $lastMessage = "";
    my $newMessage = "";
    my $userName = $_[0];
    while (1) {
        my $context = `cat chatlog.dat`;
        split(/\n/, $context);
        $newMessage = $_[$#_];
        if ($newMessage ne $lastMessage) {
            $newMessage =~ /^\(.+\):\((.+)\) (.+$)/;
            if ($1 ne $userName) { print "[$1]: $2";}
            $lastMessage = $newMessage;
        }
    }
}

my $userName = "Rocker";
my ($sec,$min,$hour) = localtime();
my $thr = threads -> create ( \&checkFile, $userName ); #Starting a thread to continuously check for the file update

while (1) {
    my $userMessage = <STDIN>; #STDIN will not interfere file checking
    last if $userMessage eq "::quit";
    `echo "($hour:$min:$sec):($userName) $userMessage" >>chatlog.dat` if $userMessage =~ /\S+/;
}

$thr -> join();
Run Code Online (Sandbox Code Playgroud)