Use of uninitialized value $code_retour in string ne at
Bonjour,
novice en développement et forcement en perl aussi.
je développe un script me permettant d'effectuer plusieurs chose sur des photos.
afin d'essayer de développer correctement, j'utilise les 2 pragma
strict et warnings.
j'utilise 2 fois le même code a 2 endroit différent
une fois dans un SUB cela ne généré pas de message.
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14
|
sub applic_change ( @_ ) {
$image->Resize(width=>$largeur_modif, height=>$hauteur_modif);
$image->Normalize() if defined $opts{n};
$code_retour = $image->Write("$fichier");
$code_retour =~ /(\d+)/;
$code_retour = $1;
if ($code_retour ne "" ) {
if ($code_retour >= "400" ) {
p_erreur($code_retour);
print "Certainement fichier en lecture seul \n";
}
}
} |
par contre cette version qui n'est pas dans un sub généré le message suivant.
Use of uninitialized value $code_retour in string ne at ./imagxlarg_v1.2.pl line 67.
vous pouvez remarquer que le code n'est pas tous a fais identique, mais avec le même code, même problème.
A ce que je comprend, si la commande ce passe bien, il n'y a pas de code retour, donc je me retrouve avec une variable non valorisé et perl n'aime pas ça.
J'ai d'ailleurs ajouté le premier if car j'avais le problème dans les 2 morceaux de code sur les if suivant. le fais de mettre le premier if a réglé le pb dans le SUB, mais pas dans l'autre cas.
Code:
1 2 3 4 5 6 7 8 9 10 11
|
$image = Image::Magick->new;
$code_retour = $image->Read($fichier) ;
$code_retour =~ /(\d+)/;
$code_retour = $1;
if ( $code_retour ne "" ) {
if ($code_retour >= "400" ) {
p_erreur($code_retour);
print "Certainement inexistant ou format non reconnue \n";
}
} |
Merci pour toute réponse (explication, solution)
voici le script complet, pour ceux qui ont plus de temps et peuvent emmètre une critique.
Je précise, qu'il doit encore évoluer. Pour le moment je fais encore une partie du travail a la main et petit à petit j'ajoute les taches au script.
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132
|
#!/usr/bin/perl
# Version 1.2
## Commentaire
# permet de réduire proportionnellement une photo en prenant le plus grand coté hauteur ou largeur (paysage ou portrait) comme base.
# le paramétré de "$taille_max" sera la taille maximum du plus grand coté.
# Les photos attentent déjà plus petites ou égale ne seront pas modifié.
# Ajout dans cette version
# option -n permet la normalisation de l'image traité, pour une meilleur image
# ajout de l'option permettant de configurer la taille max (-s 1600 pour 1600 pixel).
# reste a faire
# Gestion des erreurs
# gestion des valeur par defaut (version plus propre).
# Oblige a ecrire du code propre.
use strict;
use warnings;
## Declaration des variables local
my $taille_max;
my $image;
my $fichier;
my $largeur;
my $hauteur;
my $ratio;
my $largeur_modif;
my $hauteur_modif;
my $code_retour;
############
## Declaration des SUB
# evite les problemes de prototypage
sub applic_change ( @_ );
sub utilisation ();
sub p_erreur ($);
###########
# Active l'utilisation de la class image::magic
use Image::Magick;
use Getopt::Std;
###########
## Gestion des options
my %opts;
getopts( 'ns:', \%opts ) or utilisation();
$taille_max="1024";
$taille_max="$opts{s}" if defined $opts{s};
###########
## Traitement de chaque fichier mis en paramétré
foreach ( @ARGV ) {
# Fichier a traiter
$fichier=$_;
# Ouverture du fichier image
$image = Image::Magick->new;
$code_retour = $image->Read($fichier) ;
$code_retour =~ /(\d+)/;
$code_retour = $1;
if ( $code_retour ne "" ) {
if ($code_retour >= "400" ) {
p_erreur($code_retour);
print "Certainement inexistant ou format non reconnue \n";
next ; #### NE FONCTIONNE PAS
}
}
# recupere les valeurs de hauteur et largeur
( $largeur, $hauteur ) = $image->Get('width','height');
## redimensionnement l'image si plus grand que la taille paramétré
# verifie quelle est le coté le plus grand 'portrait ou paysage)
if ($largeur >= $hauteur) {
# redimensionne proportionnellement en prenant comme base la largeur
if ($largeur >= $taille_max) {
$ratio = ($largeur/$taille_max);
$largeur_modif = int($largeur/$ratio);
$hauteur_modif = int($hauteur/$ratio);
applic_change($fichier,$largeur_modif,$hauteur_modif);
}
}
else {
# redimensionne proportionnellement en prenant comme base la hauteur
if ($hauteur >= $taille_max ) {
$ratio = ($hauteur/$taille_max);
$largeur_modif = int($largeur/$ratio);
$hauteur_modif = int($hauteur/$ratio);
applic_change($fichier,$largeur_modif,$hauteur_modif);
}
}
}
############
## SUB
# effectue les traitement sur l'image.
sub applic_change ( @_ ) {
$image->Resize(width=>$largeur_modif, height=>$hauteur_modif);
$image->Normalize() if defined $opts{n};
$code_retour = $image->Write("$fichier");
$code_retour =~ /(\d+)/;
$code_retour = $1;
if ($code_retour ne "" ) {
if ($code_retour >= "400" ) {
p_erreur($code_retour);
print "Certainement fichier en lecture seul -2 \n";
# next ; #### NE FONCTIONNE PAS
}
}
}
# message renseignant sur l'utilisation du programme.
sub utilisation () {
print "utilisation : $0 [-n -s nb_pixel] fichier \n";
print "-n l'emploie de cette option vas normaliser la photo. L'équivalent d'un améliorer sur les outils graphique" ;
print "Je rappel donc que cette option modifie l'image. Souvent pas trop mal !!! \n";
print "-s nb_pixel représente le nombre de pixel que doit mesurer le coté le plus large \n";
}
# permet d'avoir au moins une ligne standard pour les erreurs
# permet une recherche facile dans les logs de tous les fichiers en erreur.
sub p_erreur ($) {
print "Erreur $1 sur le fichier $fichier \n";
} |
Désolé c'était dans la FAQ
et oui j'ai trouver la réponse dans la FAQ. J'ai pas tous de suite fais le raprochement.
http://perl.developpez.com/faq/perl/...nB2#sectionB26
J'ai créé un SUB pour gérér ce defined, mais il semble qu'il n'aime pas le next dans les sub. J'ai donc de nouveau warning.
je l'ai 1 fois ou 2 fois celon l'endroit ou est appelé le module
Exiting subroutine via next at ./imagxlarg_v1.2.pl line 127.
Exiting subroutine via next at ./imagxlarg_v1.2.pl line 127.
Je vais relire encore une fois la FAQ.
voila le nouveau code.
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127
| #!/usr/bin/perl
# Version 1.2
## Commentaire
# permet de reduire proportionnelement une photo en prenant le plus grand coté hauteur ou largeur (paysage ou portrait) comme base.
# le parametre de "$taille_max" sera la taille maximum du plus grand coté.
# Les photos attentent deja plus petites ou egale ne seront pas modifié.
# Ajout dans cette version
# option -n permet la normalizasion de l'image traité, pour une meilleur image
# ajout de l'option permettant de configurer la taille max (-s 1600 pour 1600 pixel).
# reste a faire
# Gestion des erreurs
# gestion des valeur par defaut (version plus propre).
# Oblige a ecrire du code propre.
use strict;
use warnings;
## Declaration des variables local
my $taille_max;
my $image;
my $fichier;
my $largeur;
my $hauteur;
my $ratio;
my $largeur_modif;
my $hauteur_modif;
my $code_retour;
############
## Declaration des SUB
# evite les problemes de prototypage
sub applic_change ( @_ );
sub utilisation ();
sub p_erreur ($);
sub bad_retour ($);
###########
# Active l'utilisation de la class image::magic
use Image::Magick;
use Getopt::Std;
###########
## Gestion des options
my %opts;
getopts( 'ns:', \%opts ) or utilisation();
$taille_max="1024";
$taille_max="$opts{s}" if defined $opts{s};
###########
## Traitement de chaque fichier mis en parametre
foreach ( @ARGV ) {
# Fichier a traiter
$fichier=$_;
# Ouverture du fichier image
$image = Image::Magick->new;
$code_retour = $image->Read($fichier) ;
$code_retour =~ /(\d+)/;
$code_retour = $1;
bad_retour $code_retour if defined $code_retour;
# recupere les valeurs de hauteur et largeur
( $largeur, $hauteur ) = $image->Get('width','height');
## redimmentionne l'image si plus grand que la taille parametre
# verifie quelle est le coté le plus grand 'portrait ou paysage)
if ($largeur >= $hauteur) {
# redimentionne proportionellement en prenant comme base la largeur
if ($largeur >= $taille_max) {
$ratio = ($largeur/$taille_max);
$largeur_modif = int($largeur/$ratio);
$hauteur_modif = int($hauteur/$ratio);
applic_change($fichier,$largeur_modif,$hauteur_modif);
}
}
else {
# redimentionne proportionellement en prenant comme base la hauteur
if ($hauteur >= $taille_max ) {
$ratio = ($hauteur/$taille_max);
$largeur_modif = int($largeur/$ratio);
$hauteur_modif = int($hauteur/$ratio);
applic_change($fichier,$largeur_modif,$hauteur_modif);
}
}
}
############
## SUB
# effectue les traitement sur l'image.
sub applic_change ( @_ ) {
$image->Resize(width=>$largeur_modif, height=>$hauteur_modif);
$image->Normalize() if defined $opts{n};
$code_retour = $image->Write("$fichier");
$code_retour =~ /(\d+)/;
$code_retour = $1;
bad_retour $code_retour if defined $code_retour;
}
# message renseignant sur l'utilisation du programme.
sub utilisation () {
print "utilisation : $0 [-n -s nb_pixel] fichier \n";
print "-n l'emploie de cette option vas normaliser la photo. L'equivalent d'un amelioerer sur les outils graphique" ;
print "Je rappel donc que cette option modifie l'image. Souvent pas trop mal !!! \n";
print "-s nb_pixel représente le nombre de pixel que doit messurer le coté le plus large \n";
}
# permet d'avoir au moins une ligne standart pour les erreurs
# permet une recherche facile dans les logs de tous les fichiers en erreur.
sub p_erreur ($) {
print "Erreur $1 sur le fichier $fichier \n";
}
sub bad_retour ($) {
if ($code_retour >= "400" ) {
p_erreur($code_retour);
print "Certainement inexistant ou format non reconue \n";
next ; #### NE FONCTIONNE PAS
}
} |