Newsgroup: it.comp.lang.perl
Titolo: macchine diverse "perl" diversi?

 Eccomi con un nuovo ed entusiasmante quesito :D
L'attore e' il mio famigerato bot irc, che bene o male con non moltissime 
funzioni, pare andare decentemente,  quindi ho deciso di provarlo su di  un 
server dedicato. Premetto che normalmente uso windows e sul mio pc ho 
installato ActivePerl.;  perl -v mi riporta "perl v5.10.0"..
Copiati i files sul dedicato "ovviamente" non funziona niente... quindi ho 
ridotto all'osso lo script lasciando solo la parte funzionale (in pratica la 
connessione e il loop principale), ho riprovato a dopo alcuni (almeno una 
15ina) secondi ricevo i seguenti errori, che si ripetono ad intervalli 
regolari ogni tot secondi:
Error! Bad file descriptor
print() on unopened filehandle 1 at 
bot.pl
 line 26.
print() on unopened filehandle 1 at 
bot.pl
 line 27.
print() on unopened filehandle 1 at 
bot.pl
 line 28.
print() on unopened filehandle 1 at 
bot.pl
 line 29.
readline() on unopened filehandle 1 at 
bot.pl
 line 32.
questo e' quello che resta dello script:
#!/usr/bin/perl
# use strict;
  use IO::Socket;
  $server = IO::Socket::INET->new(PeerAddr=>'
irc.myserver.it
,
                             PeerPort=>'6667',
                             Proto=>'tcp',
                             Timeout=>'30') || print "Error! $!\n";
 my $nick = "Arcang3lo";
 my $nickpass = "***";
 my $user = "heaven portiere e guardiano ufficiale";
 my $admpasswd = "***";
 my $helpchan = "#liftman";
 my $userchan = "#****";
         print $server "USER $user\r\n";
         print $server "NICK $nick\r\n";
         print $server "ns identify $nickpass\r\n";
         print $server "JOIN #liftman\r\n";
   while($answer = <$server>)
   {
  #PING
                 if($answer =~ m/^PING (.*?)$/gi)                 {
                         print $server "PONG ".$1."\r\n";
                  }
   }
dal momento che sia questo pezzo, che l'intero script funziona regolarmente 
sul mio pc, ho fatto la prova su un diverso dedicato e magicamente tutto 
funziona in maniera regolare. A questo punto dato che l'unico modulo esterno 
che usa lo script e' IO::Socket, potrei pensare che la colpa sia di un 
errata installazione dello stesso, pero' onestamente di andare a casaccio 
non me la sento, magari peggioro le cose.
perl -v sulla macchina "buona" da' questo risultato: This is perl, v5.8.8 
built for i486-linux-gnu-thread-multi
mantre su quella "tarocca" e' questo: This is perl, v5.8.8 built for 
x86_64-linux-gnu-thread-multi
il perl su ambedue le macchine era installato gia' all'origine, solo il 
modulo IO::Socket l'ho installato personalmente.
Suggerimenti?
-- 
Ciao!
Se hai voglia e tempo visita il mio sitarello!
www.moredifficult.org
www.liftman.org
http://florezia.myminicity.com
 

Ripristinerei strict che male non fa, e nella creazione del socket
metterei:
my $server = IO::Socket::INET->new(
   PeerAddr=>'
irc.myserver.it
,
   PeerPort=>'6667',
   Proto=>'tcp',
   Timeout=>'30'
) or die "Error! $!";
ossia utilizzerei "or" e "die" (non ha senso andare avanti
altrimenti).
"Bad file descriptor" è il tuo "vero" errore. IO::Socket non è
riuscito ad allocare un socket, magari non per problemi sulla versione
di Perl o sulla libreria, ma semplicemente perché viene fatto girare
in un ambiente "limitato" in cui non è possibile aprire connessioni
verso l'esterno. Lavorando più a basso livello, prova a vedere se
qualcosa del genere funziona:
   use Socket;
   my $proto = getprotobyname('tcp');
   socket my $sock, PF_INET, SOCK_STREAM, $proto
      or die "socket(): $!";
Se anche questo dà problemi direi che hai qualche problema a creare
socket su quella macchina... Se poi vuoi capire se la colpa è proprio
di Perl potresti provare a creare un programma simile in C, sempre che
tu possa compilarlo ed eseguirlo.
Ciao,
   Flavio.


 tu possa compilarlo ed eseguirlo.
purtroppo con il C  sono messo peggio che con il Perl, ed e' tuttto dire...
Nel frattempo ho ho fatto alcune altre prove e non commento...
questo lo script che funziona perfettamente in windows: (e sull'altra 
macchina linux)
use strict
use IO::Socket;
$con = IO::Socket::INET->new(PeerAddr=>'
irc.mioserver.net
',
        PeerPort=>'6667',
        Proto=>'tcp',
        Timeout=>'30') or die print "Error! $!\n";
print $con "USER heaven portiere e guardiano ufficiale\r\n";
print $con "NICK ArcAng3lo\r\n";
print $con "ns identify **** \r\n";
print $con "JOIN #liftman\r\n";
while($answer = <$con>)
{
 print $answer;
 if($answer =~ m/^PING (.*?)$/gi) #Answer ping requests
 {
  print $con "PONG ".$1."\r\n";
 }
}
e questa e' la risposta dell'interprete:
# perl -w 
botminimo.pl
syntax error at 
botminimo.pl
 line 2, near "use strict
use IO::Socket"
Execution of 
botminimo.pl
 aborted due to compilation errors.
a questo punto mi sento quasi preso per i fondelli...
ciao e grazie

 Execution of 
botminimo.pl
 aborted due to compilation errors.
Anche la mia con il seguente script:
___________________________
#!/usr/bin/perl -w
use strict
use Socket;
print "ciao\n";
___________________________
syntax error at ./prova line 3, near "use strict
use Socket"
Execution of ./prova aborted due to compilation errors.
___________________________
con il punto e virgola invece...
___________________________
ciao
___________________________
Succede spesso anche a me, dato che lavoro anche in vb,
dove non si usa il punto e virgola ma la fine della riga per
separare le istruzioni (no comment).
Ciao,
ScriptJus 

 separare le istruzioni (no comment).
purtroppo evidentemente ieri ho pasticciato con il cut & paste, anche se
devo dire che il ; dopo use strict mancava per davvero... pero' dopo
corretto l'errore....
$ perl -w 
botminimo.pl
Global symbol "$con" requires explicit package name at 
botminimo.pl
 line 4.
Global symbol "$con" requires explicit package name at 
botminimo.pl
 line 9.
Global symbol "$con" requires explicit package name at 
botminimo.pl
 line 10.
Global symbol "$con" requires explicit package name at 
botminimo.pl
 line 11.
Global symbol "$con" requires explicit package name at 
botminimo.pl
 line 12.
Global symbol "$answer" requires explicit package name at 
botminimo.pl
 line
16.
Global symbol "$con" requires explicit package name at 
botminimo.pl
 line 16.
Global symbol "$answer" requires explicit package name at 
botminimo.pl
 line
18.
Global symbol "$answer" requires explicit package name at 
botminimo.pl
 line
20.
Global symbol "$con" requires explicit package name at 
botminimo.pl
 line 22.
Execution of 
botminimo.pl
 aborted due to compilation errors.
questo lo script: (che ribadisco, con ESATTAMENTE questo scheletro piu'
altre schifezze aggiunte da me che in qualche modo fanno quello che mi sono
prefissato, gira tranquillamente con un uptime medio di 7 giorni prima che
il server (irc) capriccioso non decida di incasinarsi. altrimenti magari
funzionerebbe ad oltranza...
------------------------------
use strict;
use IO::Socket;
$con = IO::Socket::INET->new(PeerAddr=>'
irc.mioserver.net
',
                             PeerPort=>'6667',
                             Proto=>'tcp',
                             Timeout=>'30') or die print "Error! $!\n";
print $con "USER heaven portiere e guardiano ufficiale\r\n";
print $con "NICK ArcAng3lo\r\n";
print $con "ns identify **** \r\n";
print $con "JOIN #liftman\r\n";
while($answer = <$con>)
{
        print $answer;
        if($answer =~ m/^PING (.*?)$/gi) #Answer ping requests
        {
                print $con "PONG ".$1."\r\n";
        }
}
------------------------------
aggiungendo:
my $con = undef;
my $answer = undef;
"parte" senza warning ma dopo alcuni secondi ritorna questo:
perl -w 
botminimo.pl
Error! Bad file descriptor
1 at 
botminimo.pl
 line 5.
e continua ad andare senza problemi sia da windows che dall'altra macchina
linux a cui posso accedere.
Ciao! 

 il server (irc) capriccioso non decida di incasinarsi.
Se metti:
use strict;
allora devi dichiarare le variabili con my (o con our):
my $con = ...
while ( my $answer = <$con> ) ...
ecc.
Quindi quello script non gira (non verrebbe neanche compilato) da 
nessuna parte, almeno nella versione che hai postato.
Guarda il codice postato da Flavio: le variabili (locali) sono sempre 
dichiarate con my.

 dichiarate con my.
se leggevi fino alla fine del post (mi quoto sotto) avresti dovuto sapere 
che avevo provveduto ad eseguire quelle modifiche, che in effetti, e chiedo 
venia il mio cervello fa' acqua da tempo... avevo gia' fatto sullo script 
completo e funzionante dopo aver inserito "use strict". Cio' non toglie che 
la tua affermazione "Quindi quello script non gira (non verrebbe neanche 
compilato) da nessuna parte, almeno nella versione che hai postato" sia 
errata dal momento che evidentemente ActivePerl se ne infischia e fa' andare 
il tutto allegramente e senza intoppi,  allo stesso modo del perl "buono" 
che gira sull'altra macchina linux..
------------------------------
aggiungendo:
my $con = undef;
my $answer = undef;
"parte" senza warning ma dopo alcuni secondi ritorna questo:
perl -w 
botminimo.pl
Error! Bad file descriptor
1 at 
botminimo.pl
 line 5.
e continua ad andare senza problemi sia da windows che dall'altra macchina
linux a cui posso accedere.
------------------------------
-- 
Ciao!


 il tutto allegramente e senza intoppi...
Balle.

 Balle.
prego?
non sono una cima nella programmazione, ma certamente riesco a vedere se uno
script funziona o meno, puoi venire a casa mia a vedere o se preferisci ti
faccio un filmato, io sono sempre convinto che ci sia un "baco" nella
macchina che vorrei usare, che poi io, tu o altri riescano a capire il guaio
e risolverlo e' un'altra faccenda, ma per favore non diamo per scontato che
il neofita e' un cretino e chi risponde ha ragione per statuto, vengo qua'
per imparare qualcosa di piu' e per chiedere aiuto, ringrazio chi mi aiuta,
anche se poi l'aiuto non risolve il problema. So' come funziona un ng, so'
pure che chi risponde lo fa' per passione e niente e dovuto, resta una
certezza (anzi 2): che TU ci creda o meno, quella porzione di script, e la
stessa porzione di script con un'atra manciata di codice (circa 15k) volente
o nolente funziona su 2 distinte macchine, una con windows XP ed una con una
debian. Mentre sulla terza macchina (che purtroppo è l'unica di cui posso
disporre a mio piacimento) non va', ed e' qui che si dovrebbe indagare e non
sul mio se pur pessimo script.. Quando e se avro' disponibile un'ulteriore
server linux provero' anche li, tanto per togliermi lo sfizio...
Buon proseguimento


 Buon proseguimento
Grazie, altrettanto.

In news:f4iGl.212429$
Ca.3...@twister2.libero.it
,
Emanuele Zeppieri <ema...@tiscali.itsnip_here.invalid> typed:
E' vero, sono stato contorto nello spiegare e forse ho creato confusione sia 
a chi legeva/rispondeva che a me stesso, quindi azzero tutto, mi scuso per 
la perdita di tempo e per il disturbo e riformulo il problema con (spero) 
chiarezza.
Buon fine settimana
