Нужна помощь в разборе результатов от ldap до csv - PullRequest
2 голосов
/ 28 мая 2009

Я пытаюсь создать сценарий для создания файла csv с результатами некоторых запросов ldap с использованием Net :: LDAP, но у меня возникают проблемы с пропуском неполных строк, если один элемент массива @attributes пуст.

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

Так, например, если у пользователя нет почты в списке или нет phoneNumber в списке, то он должен пропустить поле удержания вместо возврата:

"Foo Bar",, # this line should be skipped since there is no mail nor telephone
"Bar Foo","bar@foo.com", # this line should be skipped too, no number listed
"John Dever","john_dever@google.com","12345657" # this one is fine, has all values

Мой цикл сейчас выглядит так:

# 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
}

Я пробовал код как:

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

и несколько других без удачи. Я также попробовал простой if () {print "isempty"; } отладочные тесты и не работает. Я не совсем уверен, как я мог это сделать.

Я ценю любую помощь или советы, которые вы могли бы дать мне о том, что я делаю неправильно.

Заранее большое спасибо за помощь.

UPDATE:
За запрос хаоса:

my $singleval = 0;

Пример прогона для этой программы вернет:

Jonathan Hill,Johnathan_Hill@example.com,7883                  
John Williams,John_Williams@example.com,3453                     
Template OAP,,                                            
Test Account,,                                                
Template Contracts,,

Итак, я хочу пропустить все строки, в которых отсутствует поле, либо адрес электронной почты, либо добавочный номер.

1 Ответ

2 голосов
/ 28 мая 2009

Добавьте вашу while петлю:

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

и использование:

next Record;

Ваша проблема в том, что ваш next связан с вашим foreach. Использование метки позволяет избежать этого.

Кстати, $attr == '', хотя и будет работать в этом случае, - плохая логика; в perl == - это числовое сравнение. Сравнение строк будет $attr eq ''. Хотя я бы просто использовал next Record unless $attr.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...