 |
Perl question |
 |
23.09.2004, 14:13
|
#1
|
Guru Apprentice
Join Date: 02 2002
Location: /dev/null
Age: 48
Posts: 524
Rep Power: 0
|
Perl question
Folks, нужна помощь в Perl.
Функция as_struct() в примере возвращает reference to a HASH. Все мои попытки вытащить из этого Хаша его ключи пока что приводят к разным ошибкам типа: Type of arg 1 to keys must be hash (not private variable)
Как мне ему правильно об'яснить чего я от него хочу?
Example:
Code:
my $hashref = $mesg->as_struct();
print keys $hashref;
print keys $$hashref;
__________________
\/\/h47'5 1n 4 n4m3? 7h47 wh1(h w3 (4|| 4 r053,
8y 4ny 07h3r n4m3 w0u|d 5m3|| 45 5w337...
|
|
|
23.09.2004, 14:33
|
#2
|
Guru Apprentice
Join Date: 02 2002
Location: /dev/null
Age: 48
Posts: 524
Rep Power: 0
|
Отвечу самому себе:
надо писать
Code:
my $hashref = $mesg->as_struct();
print keys %{$hashref}
А вообще - reference to a HASH of references to HASHes of references to arrays - это вам не дырка от бублика...
__________________
\/\/h47'5 1n 4 n4m3? 7h47 wh1(h w3 (4|| 4 r053,
8y 4ny 07h3r n4m3 w0u|d 5m3|| 45 5w337...
|
|
|
23.09.2004, 15:04
|
#3
|
ЙЦУКЕН
Join Date: 07 2002
Location: 0x68,0x69,0x72, 0x69,0x6e,0x67, 0x20,0x6e,0x6f, 0x77
Age: 55
Posts: 3,118
Rep Power: 0
|
Quote:
Originally Posted by Ektich
Code:
my %hashref = $mesg->as_struct();
print keys %hashref;
|
а сразу сказать, что это HASH, без кастинга, слабо ? 
или я что-то не понял
|
|
|
23.09.2004, 16:52
|
#4
|
Guru Apprentice
Join Date: 02 2002
Location: /dev/null
Age: 48
Posts: 524
Rep Power: 0
|
Не понял вопроса, но приведу весь код, чтобы ясно было что я делаю.
Если будут предложения по оптимизации - с радостью выслушаю.
Code:
my $ldap = Net::LDAP->new($ldap_server) or die "$@";
my $mesg = $ldap->bind($root_dn, password=>$root_dn_passwd) or die "$@";
$mesg = $ldap->search(base => "dc=cs,dc=may,dc=ie",
filter => "objectClass=posixAccount");
my $hashref = $mesg->as_struct();
foreach my $dn (keys %{$hashref})... ну и так далее
в двух словах: цепляемся к LDAP серверу, BIND-имся к нему, выполняем поиск.
результат поиска можно заполучить разными методами. as_struct представляет этот самый результат как упомянутый ранее reference to HASH.
__________________
\/\/h47'5 1n 4 n4m3? 7h47 wh1(h w3 (4|| 4 r053,
8y 4ny 07h3r n4m3 w0u|d 5m3|| 45 5w337...
|
|
|
23.09.2004, 16:56
|
#5
|
Guru Apprentice
Join Date: 02 2002
Location: /dev/null
Age: 48
Posts: 524
Rep Power: 0
|
О, я не заметил что nm изменил код когда квотил мой пост:
Code:
my %hashref = $mesg->as_struct();
print keys %hashref;
выдает ошибку:
Quote:
Reference found where even-sized list expected
|
__________________
\/\/h47'5 1n 4 n4m3? 7h47 wh1(h w3 (4|| 4 r053,
8y 4ny 07h3r n4m3 w0u|d 5m3|| 45 5w337...
|
|
|
23.09.2004, 17:34
|
#6
|
ЙЦУКЕН
Join Date: 07 2002
Location: 0x68,0x69,0x72, 0x69,0x6e,0x67, 0x20,0x6e,0x6f, 0x77
Age: 55
Posts: 3,118
Rep Power: 0
|
Quote:
Originally Posted by Ektich
О, я не заметил что nm изменил код когда квотил мой пост:
Code:
my %hashref = $mesg->as_struct();
print keys %hashref;
выдает ошибку:
|
тогда наверно все-таки
Code:
my %hashref = %{$mesg->as_struct()};
print keys %hashref;
этоб каждый раз не делать cast в HASH
2-ой пост видимо был правильным  )) просто много писать потом придется - если нужно будет хэш часто использовать
|
|
|
24.09.2004, 08:22
|
#7
|
Guru Apprentice
Join Date: 02 2002
Location: /dev/null
Age: 48
Posts: 524
Rep Power: 0
|
В итоге получились две работающие версии:
Code:
my $hashref = $mesg->as_struct();
foreach my $dn (keys %{$hashref}){
print "$hashref->{$dn}->{'uid'}->[0]\n";
}
и
Code:
my %hashref = %{$mesg->as_struct()};
foreach my $dn (keys %hashref){
print "$hashref{$dn}->{'uid'}->[0]\n";
}
Во втором варианте на одну стрелочку меньше. Но в плане выполнения программки я как-то никакой разницы не почуствовал (пока что).
I love Perl!!! можно извращатся!!!
__________________
\/\/h47'5 1n 4 n4m3? 7h47 wh1(h w3 (4|| 4 r053,
8y 4ny 07h3r n4m3 w0u|d 5m3|| 45 5w337...
|
|
|
22.10.2004, 11:11
|
#8
|
★★★★★★★★★★★★★
Join Date: 08 2004
Location: London, UK
Age: 46
Posts: 16,531
Rep Power: 8
|
Robert's perl tutorial - первое што выдаст гугл - хороший справочник ...
__________________
Мадмазель, Медам, Месье! "Глория" меняет курс и направляется в Кейптаун! Кому это не нравится будет расстрелян на месте. (с)
http://texneg.livejournal.com
|
|
|
22.10.2004, 12:27
|
#9
|
ЙЦУКЕН
Join Date: 07 2002
Location: 0x68,0x69,0x72, 0x69,0x6e,0x67, 0x20,0x6e,0x6f, 0x77
Age: 55
Posts: 3,118
Rep Power: 0
|
2-ой вариант правильнее чисто идеологически ....
т.к. перл уже знает, что $hashref - это переменная типа HASH и соответственно будет ругаться на изпользование в другом конкексте -- следовательно вероятность сделать ошибку уменьшится
|
|
|
All times are GMT. The time now is 10:39. |
|
|