Forum Programmation.perl Use of uninitialized value pour tester si une variable existe

Posté par  (site web personnel) .
Étiquettes : aucune
0
4
juil.
2004
C'est encore moi ....

je fais mon serveur et j'utilise maintenant les thread de perl. Et j'ai un problème pour tester si une variable existe ...
Voici donc mon code un peu simplifié:


#!/usr/bin/perl -w

use strict;
# use diagnostics;

use IO::Socket;
use Net::hostent; # gethostbyaddr()
use threads;
# use thread::Queue;
use threads::shared;

my $server;
my @messages : shared = ();
my $current_message : shared;
my $life : shared = 1;

$server = IO::Socket::INET->new(
Proto => $protocol,
LocalPort => $port,
Reuse => 1,
Listen => 5,
);
$server->autoflush(1);
die "Failure: $!\n" if !$server;
print "Listening $port\n";

my $thread_connexion = new threads(\&thread_connexion, $server);

#
# Ceci pour générer un message dans @messages pour être affiché dans le client
# Je n'utilise pas les queues car si plusieurs clients sont connectés, seul un seul
# peut afficher les messages
#
my $thread_alert = new threads(\&thread_alert);

while($life){
print "Press to quit this server.\n";
;
$life=0;
$thread_connexion->join;
$thread_alert->join;
}

sub thread_alert{
my $i=0;
while($life){
sleep(10);
$i++;
$current_message = scalar @messages;
$messages[scalar @messages]="time: $i\n";
}
}

sub thread_display{
my ($client) = @_;
my $i = $current_message;
while($life){
if(defined($messages[$i])){
# next if !$messages[$i];
print $client $messages[$i]."\n";
$i++;
}
}
}

#
# Lance un thread thread_display pour une connexion.
#
sub thread_connexion{
while($life){
if(my $client = $server->accept()){
$client->autoflush(1);
my $hostinfo = gethostbyaddr($client->peeraddr);
my $hostname = $hostinfo->name || $client->peerhost;
print "Connexion from $hostname.\n";
my $child_display = new threads(\&thread_display, $client);
my $child_listen = new threads(\&thread_listen, $client);
close $client;
}
}
}


le problème se passe dans sub thread_display:

if(defined($messages[$i])){ # ligne 128
[...]
}

en effet, Perl me dit:

Use of uninitialized value in array element at ./server line 128.

Le truc c'est que j'essaie de déterminer si $messages[$i] existe justement ...
Avez vous une idée sur comment faire (j'ai essayé exists() aussi)

Mildred
  • # $i

    Posté par  (site web personnel) . Évalué à 1.

    le probleme doit venir du $i je pense...
    • [^] # Re: $i

      Posté par  (site web personnel) . Évalué à 1.

      Merci, c'est exactement ca ...
      Il ma suffit d'initialiser $i par défaut à 0 ....

      my $current_message : shared = 0;

      Parfois il y a des trucs bête comme ça

      Merci beaucoup

      Mildred

Suivre le flux des commentaires

Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.