Perl or multiple

sbouli Messages postés 208 Statut Membre -  
sbouli Messages postés 208 Statut Membre -
Bonjour,

Je cherche à transformer :

$ftp = Net::FTP->new($ftp_host, Debug => 0, Timeout=>240)
or die "connexion impossible sur $ftp_host: $@";
en
$ftp = Net::FTP->new($ftp_host, Debug => 0, Timeout=>240)
or {
print "connexion impossible sur $ftp_host: $@\n";
return 0;
}

mais je dois rater quelque chose car j'ai une erreur à la ligne suivante, disant que j'ai surement oublié un ; au dessus ....

au secours.

Stéphane

4 réponses

  1. lami20j Messages postés 21506 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 571
     
    Re,

    Regarde tes blocs do { }

    Il faut mettre ; partout

    donc
    do { BLOC };


    Voilà
    sub ftp_upload
    {
    	($repertoire, $fichier) = @_;
    	
    	$ftp = Net::FTP->new($ftp_host, Debug => 0, Timeout=>240)
    		or do {
    			print "connexion impossible sur $ftp_host: $@\n";
    			return 0;
    		};
    		#or die "Cannot connect to $goftp_ftp: $@";
    	
    	$ftp->login($ftp_usr,$ftp_mdp)
    		or do {
    			print "login impossible sur $ftp_host:",$ftp->message;
    			return 0;
    		};
    		#or die "Cannot login ", $ftp->message; 
    	
    	$ftp->put("$repertoire/$fichier")
    		or do {
    			print "put impossible sur $ftp_host de $repertoire$fichier :",$ftp->message;
    			return 0;
    		};
    		#or die "put failed ", $ftp->message;
    	
    	$ftp->quit;
    	return 1;
    }
    
    
    sub ftp_erase {
    
    	($fichier_distant) = @_;
    
    	$ftp = Net::FTP->new($ftp_host, Debug => 0, Timeout=>240)
    		or do {
    			print "connexion impossible sur $ftp_host: $@";
    			return 0;
    		};
    		#or die "Cannot connect to $ftp_host: $@";
    	
    	$ftp->login($ftp_usr,$ftp_mdp)
    		or do {
    			print "login impossible sur $ftp_host:",$ftp->message;
    			return 0;
    		};
    		#or die "Cannot login ", $ftp->message; 
    	
    	$ftp->delete($fichier_distant)
    		or do {
    			print "delete impossible sur $ftp_host:",$ftp->message;
    			return 0;
    		};
    		#or die "delete failed ", $ftp->message;
    	
    	$ftp->quit;
    	return 1;
    }
    
    
    1
  2. lami20j Messages postés 21506 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 571
     
    Salut,

    or do BLOC


    mais je ne comprends pas l'histoire de ton return
    0
  3. sbouli Messages postés 208 Statut Membre 2
     
    hello,

    en fait j'ai créé 2 fonctions en charge du FTP (upload et erase) :

    comme je veux pouvoir faire des retry, je sors le die et je met un return 0 qui me permet de voir que ça a merdouillé :

    appel :

    $retry=3;
    $ftp_ok=false;
    until ($retry = 0 || $ftp_ok) {
    	$ftp_ok=ftp_upload($repertoire_destinataire,$fichier_destinataire);
    	$retry--;
    	if (!$ftp_ok) {sleep(30);}
    }
    if (!$ftp_ok) {
    	#Envoi d'un mail et arret
    	@args=("/usr/bin/mail", "-s", "Erreur lors de l'upload FTP de $fichier_destinataire vers le FTP : $ftp_host");
    	system (@args) == 0
    		or die "erreur lors de l'envoi d'un mail @args failed: $?";
    	die "envoi par FTP impossible vers $ftp_host après 3 tentatives.";
    }
    


    et mes fonctions :

    sub ftp_upload
    {
    	($repertoire, $fichier) = @_;
    	
    	$ftp = Net::FTP->new($ftp_host, Debug => 0, Timeout=>240)
    		or do {
    			print "connexion impossible sur $ftp_host: $@\n";
    			return 0;
    		};
    		#or die "Cannot connect to $goftp_ftp: $@";
    	
    	$ftp->login($ftp_usr,$ftp_mdp)
    		or do {
    			print "login impossible sur $ftp_host:",$ftp->message;
    			return 0;
    		};
    		#or die "Cannot login ", $ftp->message; 
    	
    	$ftp->put("$repertoire/$fichier")
    		or do {
    			print "put impossible sur $ftp_host de $repertoire$fichier :",$ftp->message;
    			return 0;
    		};
    		#or die "put failed ", $ftp->message;
    	
    	$ftp->quit;
    	return 1;
    }
    
    
    sub ftp_erase {
    
    	($fichier_distant) = @_;
    
    	$ftp = Net::FTP->new($ftp_host, Debug => 0, Timeout=>240)
    		or do {
    			print "connexion impossible sur $ftp_host: $@";
    			return 0;
    		}
    		#or die "Cannot connect to $ftp_host: $@";
    	
    	$ftp->login($ftp_usr,$ftp_mdp)
    		or do {
    			print "login impossible sur $ftp_host:",$ftp->message;
    			return 0;
    		}
    		#or die "Cannot login ", $ftp->message; 
    	
    	$ftp->delete($fichier_distant)
    		or do {
    			print "delete impossible sur $ftp_host:",$ftp->message;
    			return 0;
    		}
    		#or die "delete failed ", $ftp->message;
    	
    	$ftp->quit;
    	return 1;
    }
    
    


    Cependant même avec le do, j'ai des erreurs :

    Scalar found where operator expected at /test.pl line 308, near "$ftp"
            (Missing semicolon on previous line?)
    Scalar found where operator expected at /test.pl line 315, near "$ftp"
            (Missing semicolon on previous line?)
    Scalar found where operator expected at /test.pl line 322, near "$ftp"
            (Missing semicolon on previous line?)
    syntax error at /test.pl line 308, near "$ftp"
    syntax error at /test.pl line 322, near "$ftp"
    syntax error at /test.pl line 324, near "}"
    


    la ligne 308 c'est : $ftp->login($ftp_usr,$ftp_mdp)

    au secours

    Merci d'avance.

    Stéphane
    0
  4. sbouli Messages postés 208 Statut Membre 2
     
    pff ... parfois je suis trop nul ...

    bon, je comprend pas, mes print dans les sub n'affichent rien ...
     dans le sub ftp_upload :
       ....
                   print "upload de $repertoire/$fichier\n";
    	
    	$ftp->put("$repertoire/$fichier")
    		or do {
    			print "put impossible sur $ftp_host de $repertoire$fichier :",$ftp->message;
    			return 0;
    		};
    		#or die "put failed ", $ftp->message;
    	
    	print "fin upload de $repertoire/$fichier\n";
    

    et de même si je met :

    $retry=3;
    $ftp_ok=false;
    until ($retry = 0 || $ftp_ok) {
    	$ftp_ok=ftp_upload($repertoire_destinataire,$fichier_destinataire);
    	print "retour : $ftp_ok\n";
    	$retry--;
    	if (!$ftp_ok) {sleep(30);}
    }
    print "retourfin : $ftp_ok\n";
    if (!$ftp_ok) {
    	#Envoi d'un mail et arret
    	@args=("/usr/bin/mail", "-s", "Erreur lors de l'upload FTP de $fichier_destinataire vers le FTP : $ftp_host");
    	system (@args) == 0
    		or die "erreur lors de l'envoi d'un mail @args failed: $?";
    	die "envoi par FTP impossible vers $ftp_host après 3 tentatives.";
    }
    


    le print "retour : $ftp_ok\n"; dans le until n'est pas affiché alors que le retourfin affiche false ... j'ai donc bien un bug à l'upload du FTP mais pas de message ...

    J'ai dû rater un truc.

    Stéphane
    0