将匿名哈希插入到匿名哈希中以进行循环计数

时间:2018-11-14 12:28:26

标签: perl hash

我试图计算我在日志中跟踪的某些服务的开始和停止时间。 我不会在这里讲完整的代码,但是我做哈希的方法是这样的:  我将这些起点和终点传递给匿名哈希。  首先,我创建一个填充有键和值的匿名哈希(在我的情况下,$ knot是键,零是值)。接下来,我用另一个哈希替换值。 我的代码如下:

foreach $knot (@knots){ 
        chomp $knot;
        $variable = $variable."$knot;0;";

        $Services = {split(/;/,$variable)};
}

 my $data =
    {
            Starts=>'0',
            Stops=>'0',
    };  

foreach my $key (keys %$Services) {
           $Services->{$key} = $data; 
}
print Dumper $Services;

打印显示:

$VAR1 = {
      ' knot1' => {
                      'Stops' => '0',
                      'Starts' => '0'
                    },
      ' knot2' => $VAR1->{' knot1'},
      ' knot3' => $VAR1->{' knot1'},
      ' knot4' => $VAR1->{' knot1'},
      ' knot5' => $VAR1->{' knot1'},

,依此类推。有更好的方法吗?如果我是对的,我的方法会写得不好,因为更改knot1开始/停止会更改所有其他结值。

1 个答案:

答案 0 :(得分:0)

在Perl中,借助Autovivification,计数非常简单。您可以随时创建匿名数据结构,如下所示:

#!/usr/bin/env python
import inspect

called=lambda: inspect.stack()[1][3]

def caller1():
    print "inside: ",called()

def caller2():
    print "inside: ",called()

if __name__=='__main__':
    caller1()
    caller2()
shahid@shahid-VirtualBox:~/Documents$ python test_func.py 
inside:  caller1
inside:  caller2
shahid@shahid-VirtualBox:~/Documents$

这将产生所需的计数结构:

use Data::Dumper;

my %hash = ();

$hash{apple}{green}++;
$hash{apple}{red}  ++;
$hash{pear}{yellow}++;
$hash{apple}{green}++;
$hash{apple}{red}  ++;
$hash{apple}{green}++;

print Dumper(\%hash);

这也可以在使用变量的循环中使用(此处使用对哈希的引用):

$VAR1 = {
          'apple' => {
                       'green' => 3,
                       'red' => 2
                     },
          'pear' => {
                      'yellow' => 1
                    }
        };

导致:

my $hash_ref = {};
for my $fruit (qw( apple pear apple peach apple pear )) {
    $hash_ref->{$fruit}++;
}
print Dumper($hash_ref);