2017-05-21 118 views
-3

我有一個如下定義的數組。從數組中讀取值

我能夠獲取emailuid的值,如下所述。我如何獲得用戶顯示名稱userdn

my ($mesg) = $ldap->search(
    scope => 'one', 
    base => $userdn, 
    filter => $filter, 
    attrs => [ 'email', 'pwdChangedTime', 'uid' ], 
); 

這是我如何閱讀電子郵件ID和uid,但我無法讀取用戶顯示名稱。

foreach my $entry ($mesg->all_entries) { 

    $email = ${ $entry->get('email') }[0]; 
    $uid = ${ $entry->get('uid') }[0]; 
    $uName = ${ $entry->get('userdn') }; 
} 
+0

請解釋'$ ldap'是什麼。你是如何定義它的? – Borodin

回答

5

這不是關於數組,而是關於如何使用Net::LDAP。示例代碼中沒有數組。

您希望獲得userdn屬性,用於從LDAP查詢返回的項目。爲此,您需要tell search to fetch those

爲每個與搜索過濾器匹配的條目返回的屬性列表。

這意味着,你需要包括用戶DN在調用search

my ($mesg) = $ldap->search(
    scope => 'one', 
    base => $userdn, 
    filter => $filter, 
    attrs => [ 'email', 'pwdChangedTime', 'uid', 'userdn' ], 
); 

現在你可以get用戶DN

$uName = $entry->get('userdn')->[0]; 

我用箭頭取消引用語法而不是${ ... }[0]這裏,是因爲我覺得這更容易閱讀。但是,as ysth points out below in the comments,get已棄用,且當前版本Net::LDAP中未記錄。它在012年12月發佈的0.21版中是was deprecated,現在是17年前的版本。

而應該使用get_value,它返回該屬性的第一個值。

$uName = $entry->get_value('userdn'); 
+0

'$ {$ entry-> get('uid')} [0]'確定看起來像一個數組給我 – ysth

+1

@ysth看起來像一個數組引用;) – simbabque

+0

從代碼(get被棄用,似乎並不被記錄),它看起來像get將返回標量上下文中的數組引用和列表上下文中的列表。所以需要數組切片或列表切片。或者改用get_value。 – ysth