Go Back   Armenian Knowledge Base > Technical sections > Languages, Compilers, Interpreters

Reply
 
Thread Tools

Perl question
Old 23.09.2004, 14:13   #1
Guru Apprentice
 
Join Date: 02 2002
Location: /dev/null
Age: 48
Posts: 524
Rep Power: 0
Default 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...

Old 23.09.2004, 14:33   #2
Guru Apprentice
 
Join Date: 02 2002
Location: /dev/null
Age: 48
Posts: 524
Rep Power: 0
Default

Отвечу самому себе:
надо писать

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...

Old 23.09.2004, 15:04   #3
nm
ЙЦУКЕН
 
Join Date: 07 2002
Location: 0x68,0x69,0x72, 0x69,0x6e,0x67, 0x20,0x6e,0x6f, 0x77
Age: 55
Posts: 3,118
Rep Power: 0
Default

Quote:
Originally Posted by Ektich
Code:
my %hashref = $mesg->as_struct();
print keys %hashref;

а сразу сказать, что это HASH, без кастинга, слабо ?
или я что-то не понял

Old 23.09.2004, 16:52   #4
Guru Apprentice
 
Join Date: 02 2002
Location: /dev/null
Age: 48
Posts: 524
Rep Power: 0
Default

Не понял вопроса, но приведу весь код, чтобы ясно было что я делаю.
Если будут предложения по оптимизации - с радостью выслушаю.

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...

Old 23.09.2004, 16:56   #5
Guru Apprentice
 
Join Date: 02 2002
Location: /dev/null
Age: 48
Posts: 524
Rep Power: 0
Default

О, я не заметил что 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...

Old 23.09.2004, 17:34   #6
nm
ЙЦУКЕН
 
Join Date: 07 2002
Location: 0x68,0x69,0x72, 0x69,0x6e,0x67, 0x20,0x6e,0x6f, 0x77
Age: 55
Posts: 3,118
Rep Power: 0
Default

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-ой пост видимо был правильным )) просто много писать потом придется - если нужно будет хэш часто использовать

Old 24.09.2004, 08:22   #7
Guru Apprentice
 
Join Date: 02 2002
Location: /dev/null
Age: 48
Posts: 524
Rep Power: 0
Default

В итоге получились две работающие версии:
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...

Old 22.10.2004, 11:11   #8
★★★★★★★★★★★★★
 
Hrach_Techie's Avatar
 
Join Date: 08 2004
Location: London, UK
Age: 46
Posts: 16,531
Rep Power: 8
Default

Robert's perl tutorial - первое што выдаст гугл - хороший справочник ...
__________________
Мадмазель, Медам, Месье! "Глория" меняет курс и направляется в Кейптаун! Кому это не нравится будет расстрелян на месте. (с)

http://texneg.livejournal.com

Old 22.10.2004, 12:27   #9
nm
ЙЦУКЕН
 
Join Date: 07 2002
Location: 0x68,0x69,0x72, 0x69,0x6e,0x67, 0x20,0x6e,0x6f, 0x77
Age: 55
Posts: 3,118
Rep Power: 0
Default

2-ой вариант правильнее чисто идеологически ....


т.к. перл уже знает, что $hashref - это переменная типа HASH и соответственно будет ругаться на изпользование в другом конкексте -- следовательно вероятность сделать ошибку уменьшится
Reply




Реклама:
реклама
Buy text link .

All times are GMT. The time now is 10:39.
Top

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.