Próbuję napisać jakiś podstawowy system czatu tylko po to, aby nauczyć się perla. Próbuję wprowadzić chatlog do pliku 1 i wydrukować nową wiadomość, jeśli jest ona widoczna w pliku chatlog.dat
, więc napisałem funkcję, która robi prawie to samo, ale mam pewne problemy i nie wiem, jak rozwiązać im. Teraz mam 2 problemy!Podstawowy system czatowy na perlu pod Linuksem
nie mogłem zrozumieć, jak zachować
checkFile
funkcja zawsze aktywna (np multiprocession) do ciągłego sprawdzania nowych wiadomościTen problem występuje, gdy próbuję napisać nową wiadomość, która będzie dołączana do czatu. Tłumacz czeka na moje wejście na linię
my $newMessage = <STDIN>;
, ale co jeśli ktoś napisze nową wiadomość? nie będzie pokazane, dopóki nie wciśnie enter ... jak to unieważnić?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; } } }
To co 'pętle select' są przeznaczone. Ułatwione używanie IO :: Select, ale wciąż niezwykle skomplikowane. Prostsze korzystanie z wątków. – ikegami
Tworzysz także rodzaj wyścigu - jeśli wyślesz dwie wiadomości w krótkich odstępach czasu, wydrukujesz tylko drugą. – Sobrique
@Sobrique tak, to jest trzeci problem, ale nie ma wysokiego priorytetu JESZCZE, przynajmniej mogę dodać opcję czasu do czatu, aby nowo wydrukowane wiadomości miały inny czas, dlatego będzie to uważane za NOWY komunikat – PYPL