Armenian Knowledge Base  

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

Reply
 
LinkBack Thread Tools
Old 23.09.2004, 15:13   #1
Guru Apprentice
 
Join Date: 02 2002
Location: /dev/null
Age: 41
Posts: 524
Downloads: 0
Uploads: 0
Reputation: 0 | 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;
Reply With Quote
Old 23.09.2004, 15:33   #2
Guru Apprentice
 
Join Date: 02 2002
Location: /dev/null
Age: 41
Posts: 524
Downloads: 0
Uploads: 0
Reputation: 0 | 0
Default

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

Code:
my $hashref = $mesg->as_struct();
print keys %{$hashref}
А вообще - reference to a HASH of references to HASHes of references to arrays - это вам не дырка от бублика...
Reply With Quote
Old 23.09.2004, 16:04   #3
ЙЦУКЕН
 
Join Date: 07 2002
Location: 0x68,0x69,0x72, 0x69,0x6e,0x67, 0x20,0x6e,0x6f, 0x77
Age: 47
Posts: 3,118
Downloads: 0
Uploads: 0
Reputation: 5 | 0
Default

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

а сразу сказать, что это HASH, без кастинга, слабо ?
или я что-то не понял
Reply With Quote
Old 23.09.2004, 17:52   #4
Guru Apprentice
 
Join Date: 02 2002
Location: /dev/null
Age: 41
Posts: 524
Downloads: 0
Uploads: 0
Reputation: 0 | 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.
Reply With Quote
Old 23.09.2004, 17:56   #5
Guru Apprentice
 
Join Date: 02 2002
Location: /dev/null
Age: 41
Posts: 524
Downloads: 0
Uploads: 0
Reputation: 0 | 0
Default

О, я не заметил что nm изменил код когда квотил мой пост:

Code:
my %hashref = $mesg->as_struct();

print keys %hashref;
выдает ошибку:
Quote:
Reference found where even-sized list expected
Reply With Quote
Old 23.09.2004, 18:34   #6
ЙЦУКЕН
 
Join Date: 07 2002
Location: 0x68,0x69,0x72, 0x69,0x6e,0x67, 0x20,0x6e,0x6f, 0x77
Age: 47
Posts: 3,118
Downloads: 0
Uploads: 0
Reputation: 5 | 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-ой пост видимо был правильным )) просто много писать потом придется - если нужно будет хэш часто использовать
Reply With Quote
Old 24.09.2004, 09:22   #7
Guru Apprentice
 
Join Date: 02 2002
Location: /dev/null
Age: 41
Posts: 524
Downloads: 0
Uploads: 0
Reputation: 0 | 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!!! можно извращатся!!!
Reply With Quote
Old 22.10.2004, 12:11   #8
★★★★★★★★★★★★★
 
Hrach_Techie's Avatar
 
Join Date: 08 2004
Location: London, UK
Age: 38
Posts: 16,531
Downloads: 8
Uploads: 0
Reputation: 482 | 6
Default

Robert's perl tutorial - первое што выдаст гугл - хороший справочник ...
Reply With Quote
Old 22.10.2004, 13:27   #9
ЙЦУКЕН
 
Join Date: 07 2002
Location: 0x68,0x69,0x72, 0x69,0x6e,0x67, 0x20,0x6e,0x6f, 0x77
Age: 47
Posts: 3,118
Downloads: 0
Uploads: 0
Reputation: 5 | 0
Default

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


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

Thread Tools


На правах рекламы:
реклама

All times are GMT. The time now is 10:09.


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