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
    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. 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. 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