Perl or multiple

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. Modérateur
    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. Modérateur
      Salut,

      or do BLOC


      mais je ne comprends pas l'histoire de ton return
      1. 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
        1. 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