2009-05-28 18 views
2

Net :: LDAPを使用していくつかのLDAPクエリの結果を含むcsvファイルを生成するスクリプトを作成しようとしていますが、属性配列は空です。ldapの結果をcsvに解析するのに役立つ

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

ユーザーがリストされているにメール、または全くtelephoneNumberの列挙されていないのであれば、たとえば、それが代わりに返すの保持フィールド飛ばしてください:

"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 

私のループを、今はこのように見ています:

# 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,[email protected],7883     
John Williams,[email protected],3453      
Template OAP,,            
Test Account,,             
Template Contracts,, 

それでは、私がやりたいと、そのすべての行をスキップすることです電子メールまたは内線番号のフィールドが欠落しています。

答えて

2

ラベルあなたのwhileループ:

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

と使用は:

next Record; 

あなたの問題は、あなたのnextがあなたのforeachに関連付けられていることです。ラベルを使用することでそれが回避されます。

ところで、$attr == ''、この場合は動作しますが、悪い論理です。 perlでは==は数値比較です。文字列の比較は$attr eq ''となります。私はちょうどnext Record unless $attrを使用していますが。

+0

whileループにラベルを付け、次のレコードを使用することをお勧めしましたが、$ attrがまだ空のフィールドでこれらの行を印刷していない限り、私はあなたの提案を試みました。 ご意見ありがとうございます。私はperlに慣れていないので、数値以外の値に対して==の代わりにeqを使用しなければならないことに気付かなかった。ヒントをありがとう! –

+0

ようこそ。あなたのコードをもっと詳しく見ると、$ attrは配列リファレンスであるため、常に真です。 @ $ attrを除いて次のレコードを試してください。 – chaos

+0

私はエラーがどこか他の場所だと思うので、(も、(@ $ attr eq ""){print "empty";}とその印刷されていない空白のいずれかでした。 –

関連する問題