Identifier chaîne vide en Perl
Il y a probablement une solution facile à ce problème, mais je ne peux pas la comprendre. Je suis à la recherche de:
- prendre un fichier CSV dans un tableau
- boucle à travers le tableau et de diviser les champs de variables
- si le tableau de champ est vide, puis définissez la variable "N/A"
Note: C'est seulement la $variable
" N/A
" que je ne peux pas obtenir de travail.
Par exemple:
foreach $var (@list) {
($name,$date,$size, etc...)=split(/,\"/,$var);
}
Comment pourrais-je définir $date
" N/A
" si le champ dans le tableau est vide?
de sorte à produire:
$name = Jim
$date = N/A
$size = small
J'espère que cela a du sens et est facile à corriger.
-Merci
Ce sera l'entrée comme si la date est manquante? Si l'entrée est: abc,200 (où 200 est de taille), puis la date serait fixée à 200 droit?
/,\"/
une drôle d'odeur. Faites de votre champs de commencer avec un devis et ne pas finir avec une citation? Êtes-vous le décapage de suivi de devis à partir des données après la split
appel? Le premier champ de ne pas commencer avec une citation?OriginalL'auteur Nate the Noob | 2010-12-20
Vous devez vous connecter pour publier un commentaire.
En supposant que la variable
$date
est pas défini lors de "vide":Ou de façon plus concise:
Ou si c'est vraiment une chaîne vide, c'est à dire
$date = '';
(cela fonctionnera également dans le cas où$date
est pas défini, mais vous ne voulez pas utiliser cette fonction si vous seulement souhaitez identifier les cas où il n'est pas défini):Ou de façon plus concise (à noter que ce sera également mis en
$date
àN/A
si$date
est'0'
en raison de Perl à typage faible):Vous pourriez le faire aussi :
$date ||= 'N/A';
J'aime, donc j'ai édité.
Ok, +1
le "||=" est un bug si les valeurs contiennent des "0". Probablement pas le cas pour le champ "date", mais vous devez tout de même mentionner que la mise en garde
OriginalL'auteur marcog
En ce qui concerne votre troisième point et le libellé de la question: pour vérifier la vacuité:
Pour la chaîne vide, vous pouvez le faire ci-dessus mentionné
eq ""
, ou vous pouvez vérifier la longueur de la chaîne:$var = "N/A" unless length($var);
;Pour un indéfini de chaîne vide, en Perl 5.10 vous pouvez utiliser le bouton "définies " ou" (
//
) opérateur de faire la version courte:$var = "N/A" unless length($var //'');
En Perl avant 5.10 où "définies " ou" n'est pas disponible, vous devrez préciser la définition de vérifier:
$var = "N/A" unless defined $var && length($var);
... ou, vous pouvez juste arrêter de se soucier de undefined avertissements en les désactivant (h/t brian d foy):
Cependant, veuillez noter que vous devriez également considérer une approche différente pour les deux premiers points de balle. La mise en œuvre de votre propre CSV analyseur qui est correct à 100% n'est pas trivial - par exemple, votre exemple de code ne fonctionnera plus si l'un des champs contient un guillemet double.
Au lieu de cela, vous devez toujours utiliser l'une de l'Perl standard CSV analyseurs, comme
Text::CSV_XS
.OriginalL'auteur DVK
Assurez-vous d'utiliser la chaîne de comparaison pour la comparaison de chaînes 🙂
Vous devez utiliser
''
et pas""
si aucune interpolation n'est prévu.Bon d'accord, c'est un peu hors sujet, mais pourquoi? En plus d'être dans PBP, est-il une raison particulière d'utiliser " au lieu de ""? De mon deux-deuxième expérience, ils tournent dans le même opcodes. Quelle que soit sa valeur, j'ai utiliser ", parce que j'aime la façon dont il semble (et je ne vais pas utiliser quelque chose de stupide comme q {}, sauf si je peux l'aider).
interpole les caractères échappés comme
\n
,\t
,\`, etc. while
" ne veut pas.'hello\n
va littéralement êtrehello\n
alors que le "bonjour\n" serahello<newline>
.Je pose la question dans le contexte des chaînes vides.
OriginalL'auteur StanislawSwierc
Ce sera l'entrée comme si la date est manquante? Si l'entrée est: abc,200 (où 200 est de taille), puis la date serait fixée à 200 droit?
Si l'entrée est comme ça
abc,,200
où 200 est de taille, et parce que la date n'est pas disponible, il est vide. Ensuite, vous pouvez faire simple si-vérifier:
Note $date sera définie, elle sera mise à vide
OriginalL'auteur Ngm
nous pouvons utiliser le code ci-dessus pour identifier la chaîne vide ,et en utilisant l'expression régulière est plus efficace. Le "=~" de l'opérateur et de l'utilisation d'une expression régulière aussi, nous pouvons également ce problème.
OriginalL'auteur dhana govindarajan