2009-05-28 29 views
2

Je suis en train de créer un script pour générer un fichier csv avec les résultats de certaines requêtes ldap en utilisant Net :: LDAP mais j'ai des problèmes en ignorant les lignes incomplètes si un élément du @ Le tableau d'attributs est vide.Besoin d'aide analyse des résultats de ldap à csv

my @attributes = ('cn', 'mail', 'telephoneNumber'); 

Ainsi, par exemple, si un utilisateur n'a pas mail ci, ou pas telephoneNumber la liste, il devrait sauter le champ de maintien au lieu de retourner:

"Foo Bar",, # this line should be skipped since there is no mail nor telephone 
"Bar Foo","[email protected]", # this line should be skipped too, no number listed 
"John Dever","[email protected]","12345657" # this one is fine, has all values 

Ma boucle de droite est maintenant à la recherche comme celui-ci :

# Now dump all found entries 
while (my $entry = $mesg->shift_entry()){ 
    # Retrieve each fields value and print it 
    # if attr is multivalued, separate each value 
    my $current_line = ""; # prepare fresh line 
    foreach my $a (@attributes) { 
     if ($entry->exists($a)) { 
      my $attr = $entry->get_value($a, 'asref' => 1); 
      my @values = @$attr; 
      my $val_str = ""; 
      if (!$singleval) { 
       # retrieve all values and separate them via $mvsep 
       foreach my $val (@values) { 
        if ($val eq "") { print "empty"; } 
        $val_str = "$val_str$val$mvsep"; # add all values to field 
       } 
       $val_str =~ s/\Q$mvsep\E$//; # eat last MV-Separator 
      } else { 
       $val_str = shift(@values); # user wants only the first value 
      } 

      $current_line .= $fieldquot.$val_str.$fieldquot; # add field data to current line 

     } 
     $current_line .= $fieldsep; # close field and add to current line 
    } 
    $current_line =~ s/\Q$fieldsep\E$//; # eat last $fieldsep 
    print "$current_line\n"; # print line 
} 

J'ai essayé le code comme:

if ($attr == "") { next; } 
if (length($attr) == 0) { next; } 

et plusieurs autres sans aucune chance. J'ai aussi essayé simple if() {print "isempty"; } tests de débogage et son ne fonctionne pas. Je ne suis pas exactement sûr comment pourrais-je faire cela.

J'apprécie toute aide ou des conseils que vous pourriez me donner sur ce que je fais mal.

Merci beaucoup d'avance pour votre aide.

MISE À JOUR:
sur demande du chaos:

my $singleval = 0; 

renverrait une série d'échantillons pour ce programme:

Jonathan Hill,Joh[email protected],7883     
John Williams,[email protected],3453      
Template OAP,,            
Test Account,,             
Template Contracts,, 

Donc ce que je veux faire est de sauter toutes les lignes Il manque un champ, soit un courriel, soit un numéro de poste.

Répondre

2

Étiquette votre boucle while:

Record: while (my $entry = $mesg->shift_entry()){ 

et utilisation:

next Record; 

Votre problème est que votre next est associé à votre foreach. L'utilisation de l'étiquette évite cela. Par ailleurs, $attr == '', bien que cela fonctionnera dans ce cas, est une mauvaise logique; en perl, == est une comparaison numérique. La comparaison de chaînes serait $attr eq ''. Bien que je voudrais juste utiliser next Record unless $attr.

+0

J'ai essayé votre suggestion d'étiqueter la boucle while et d'utiliser Next Record à moins que $ attr mais il imprime encore ces lignes avec des champs vides. J'apprécie beaucoup vos suggestions! Je suis nouveau à perl et je ne savais pas que je devais utiliser eq au lieu de == pour les valeurs non numériques. Merci pour le conseil!!! –

+0

Vous êtes les bienvenus. En regardant votre code de plus près, $ attr est une référence de tableau, donc ce sera toujours vrai. Essayez l'enregistrement suivant à moins que @ $ attr; – chaos

+0

que le travail soit :(na pas aussi, j'ai essayé de faire si (@ eq $ attr « ») {print « vide »;} et son impression ne vide donc je pense que l'erreur est un autre endroit –