comment éviter l'Utilisation de la valeur non initialisée dans la concaténation (.) ? en perl v5.8.4
$ perl -e 'use warnings;my ($a,$b);$c=$a.$b;print $c'
Use of uninitialized value in concatenation (.) or string at -e line 1.
Use of uninitialized value in concatenation (.) or string at -e line 1.
Je vois que
J'ai décidé qu'il
use 5.8.4;
use strict;
use warnings;
use Test::More tests => 2;
my ( $start, $end, $sysid, $ver, $tradetype );
( $start, $end ) = ( 1, 10 );
my $test = make_string( $start, $end, $sysid, $ver, $tradetype );
is( $test, "1,10,,,\n", "make index string" );
is( make_string( 0, 0, 0, 0, 0, ), "0,0,0,0,0\n", "test number" );
sub make_string {
my @input = @_;
my @input_init = map { !defined $_ ? '' : $_ } @input;
my $rezult = join q{,}, @input_init;
return $rezult . "\n";
}
j'ai décidé à cette question, mais je voulais savoir comment ce problème peut être résolu en d'autres personnes
- Vous voyez quoi? ("Je vois que" n'est pas terminée dans ce contexte.) Vous avez décidé quoi? Vous n'avez pas initialisé
$sysid
,$ver
et$tradetype
avant l'appel àmake_string()
. Pensez-vous vraiment que la mise à niveau, par exemple, Perl 5.14.1 (vous êtes trois principaux rejets actuels). (FWIW: votre code de test fonctionne correctement avec 5.10.0 et 5.14.1 sur mon Mac. Je n'ai pas de Perl 5.8.x compilé sur elle.) - le deuxième exemple fonctionne. dans
sub make_string
il initialise avec l'opérateur ternaire avec la carte. Mais je ne comprends toujours pas sa question. Je suppose que c'est quelque chose à propos de thi 1er exemple. - C'est probablement parce qu'il n'a pas à poser une question.
- "Je vois que l'. Je l'ai décidé." Tellement vrai. Tellement vrai.
- Donc...euh...vous avez eu un problème avec votre premier exemple, et votre deuxième exemple il fixe. Droit, et quel est le problème? Les deux exemples qui n'ont rien à voir les uns avec les autres.
Vous devez vous connecter pour publier un commentaire.
La façon la plus courante de se joindre à un groupe de manière inconditionnelle des objets définis par l'est de supprimer les valeurs par
grep
Toutefois vous souhaitez un indicateur pour chaque valeur, définie ou non.
Mais voici une autre chose que vous pouvez faire.
Certaines personnes ont des réserves inutiles sur la façon de transformer des avertissements.
map { $_ // '' }
?Test pour definedness ou désactiver les avertissements qui entoure le code là où vous ne voulez pas voir la plainte:
no warnings qw(uninitialized);
, voir perllexwarnDepuis
undef
valeur ne représente pas une chaîne, et l'opérateur binaire.
concatène deux chaînes de caractères que vous ne pouvez pas éviter l'avertissement avecuse warnings
.Soit
$a
et$b
doivent être des chaînes de caractères.Toutefois, comme indiqué dans d'autres réponses que vous peut désactiver les avertissements juste pour les variables non initialisées.