trinitr0
@trinitr0
провинциальный админ

Как работает многозначный хеш?

Разбирая примеры по работе с хешами в perl,
не смог понять такой пример работы с многозначным хешем:

%ttys=();
open (WHO, "who|");
while(){
        ($user, $tty) = split;
        push(@ {$ttys{$user}}, $tty);
}
foreach $user (sort keys %ttys){
	print "$user: @{$ttys{$user}}\n"
}


Не cосвсем понимаю как происходит помещение в массив:

push(@ {$ttys{$user}}, $tty);

Поясните пожалуйста!
  • Вопрос задан
  • 381 просмотр
Решения вопроса 1
vaut
@vaut
Именно по этой структуре.
push принимает два аргумента, массив (@{$ttys{$user}}) и значение которое добавляет ($tty)

что за зверь @{$ttys{$user}}?
$ttys{key}означает что работаем с скаляром соответствующим ключу key
@{$ref}получение масива по ссылке.
Вместе получается так: взять из хеша ttys значение по ключу $user и разыменовывать полученную ссылку как массив.

Для изучения перла можно почитать верблюда или если это слишком много ламу (shop.oreilly.com/product/9780596000271.do и shop.oreilly.com/product/9781565920422.do) А именно такие сложные структуры хорошо описаны в shop.oreilly.com/product/0636920012689.do
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
@krypt3r
Мне в свое время разобраться с такими структурами на начальной стадии помогла книга "Perl. Специальный справочник" С. Холзнера.
И, кстати, код у вас неважнецкий. Сравните с таким:
#!/usr/bin/env perl

use strict;
use warnings;
use Data::Dumper;

my %ttys;
open my $WHO, '-|', '/bin/who' or die "open() error: $!\n";
while (<$WHO>) {
    my ($user, $tty) = split;
    push @{$ttys{$user}}, $tty;
}
close $WHO;
#print Dumper(\%ttys);
foreach my $user (sort keys %ttys) {
  print "$user: @{$ttys{$user}}\n";
}
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы