perl-在此程序上循环时的工作方式

时间:2019-01-02 14:32:00

标签: perl

我有这段代码,但我不了解$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 :(得分:3)

$counts{$user}{$program}++;递增存储在嵌套哈希中的键$program上的值,该哈希值(作为参考)存储为$counts{$user}的值。

当perl看到表达式$counts{$user}{$program}时,它将创建存储在$counts{$user}中的(嵌套)哈希(如果尚不存在)。这称为“自身生存”。如果还不存在,perl还将在此(嵌套的)哈希中创建键$program,并将其值设置为undef。

如果在调用$counts{$user}{$program}时尚未定义++处的值,则perl会假定您要在此插槽中输入一个数字并将其初始化为0。