Perl - как работает цикл while в этой программе - PullRequest
0 голосов
/ 02 января 2019

У меня есть этот код, но я не понимаю, как именно он работает $counts{$user}{$program}++;

my %counts;

open my $IN, '<', 'SESSION.txt' or die;
while (<$IN>) {
  next if length ($_) < 51;
  my ($sid, $user, $terminal, $program) = unpack 'A9 @11 A25 @37 A15 @53 A25';

  next if $sid eq '---------';  # you need some way to filter out bogus or header rows

  $program =~ s/\(.+//;         # based on your example, turn toto (fifi) into toto

  $counts{$user}{$program}++; #how that work ?
}
#close $IN;

while (my ($user, $ref) = each %counts) {
  while (my ($program, $count) = each %$ref) {
    print "User = $count $user with program $program\n";
  }
}

1 Ответ

0 голосов
/ 02 января 2019

$counts{$user}{$program}++; увеличивает значение, хранящееся в ключе $program во вложенном хэше, которое сохраняется (по ссылке) как значение $counts{$user}.

Когда Perl видит выражение $counts{$user}{$program}, оно будетсоздайте (вложенный) хеш, хранящийся в $counts{$user}, если он еще не существует.Это называется «автовивификация».Perl также создаст ключ $program в этом (вложенном) хэше, если он еще не существует, и установит его значение undef.

Если значение в $counts{$user}{$program} еще не определено при вызове ++ на нем Perl предположит, что вы хотите число в этом слоте и инициализируете его с 0.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...