【问题标题】:How to build a Perl multidimensional array or hash?如何构建 Perl 多维数组或哈希?
【发布时间】:2015-02-01 18:44:12
【问题描述】:

我有一组这样的 CSV 值:

device name, CPU value, frequency of CPU value, CPU in percentage

例如

router1,5,10,4
router1,5,1,5
router2,5,10,4
router2,5,2,5
router3,4,5,6
router3,7,6,5

我需要形成这样的数据结构:

array = {
    router1 => [5,10,4],[5,1,5],
    router2 => [5,10,4],[5,2,5],
    router3 => [4,5,6],[7,6,5]
}

我需要帮助才能在 Perl 中形成这种数据结构。

我尝试过想象如何做到这一点,但无法做到。我将不胜感激。

我的最终目标是将其转换为 JSON 对象。

【问题讨论】:

    标签: arrays perl hash


    【解决方案1】:

    这应该可以帮助您入门。它使用DATA 文件句柄,以便我可以将数据嵌入程序本身。我使用来自JSON 模块的to_json 将散列格式化为JSON 数据。语句$_ += 0 for @values@values 的内容从字符串转换为数字,以避免生成的JSON 数据中出现引号。

    use strict;
    use warnings;
    
    use JSON;
    
    my %data;
    
    while (<DATA>) {
      chomp;
      my ($device, @values) = split /,/;
      $_ += 0 for @values;
      push @{ $data{$device} }, \@values;
    }
    
    print to_json(\%data, { pretty => 1, canonical => 1 });
    
    __DATA__
    router1,5,10,4
    router1,5,1,5
    router2,5,10,4
    router2,5,2,5
    router3,4,5,6
    router3,7,6,5
    

    输出

    {
       "router1" : [
          [
             5,
             10,
             4
          ],
          [
             5,
             1,
             5
          ]
       ],
       "router2" : [
          [
             5,
             10,
             4
          ],
          [
             5,
             2,
             5
          ]
       ],
       "router3" : [
          [
             4,
             5,
             6
          ],
          [
             7,
             6,
             5
          ]
       ]
    }
    

    【讨论】:

      【解决方案2】:

      这是一个打印所需 JSON 对象的简单解决方案。

      #!/usr/bin/env perl    
      
      use strict;
      use warnings;
      use 5.010;
      
      my %hash;
      
      while (my $line = <DATA>) {
        chomp $line;
        my ($device, @cpu_values) = split(/,/, $line);
        my $cpu_token = join(",", @cpu_values);
        $hash{$device} .= '[' . $cpu_token . '], ';
      }
      
      my @devices = keys %hash;
      
      print "array = { \n";
      foreach  (sort @devices) {
      
          print "$_ => [$hash{$_}]\n";
      
      } 
      print "}\n";
      
      __DATA__
      router1,5,10,4
      router1,5,1,5
      router2,5,10,4
      router2,5,2,5
      router3,4,5,6
      router3,7,6,5
      

      【讨论】:

        【解决方案3】:

        在 Perl 中,您需要以匿名数组和散列的方式使用引用来创建多维数组、数组的数组、包含散列的散列以及介于两者之间的任何位置。 perlreftut 应该涵盖如何完成您正在尝试做的事情。这是我前几天写的一个例子,也可以帮助解释:

        print "\nFun with multidimensional arrays\n";
        my @myMultiArray = ([1,2,3],[1,2,3],[1,2,3]);
        
        for my $a (@myMultiArray){
            for my $b (@{$a}){
                print "$b\n";
            }
        }
        
        print "\nFun with multidimensional arrays containing hashes\nwhich contains an anonymous array\n";
        my @myArrayFullOfHashes = (
            {'this-key'=>'this-value','that-key'=>'that-value'},
            {'this-array'=>[1,2,3], 'this-sub' => sub {return 'hi'}},
        );
        
        for my $a (@myArrayFullOfHashes){
            for my $b (keys %{$a}){
                if (ref $a->{$b} eq 'ARRAY'){
                    for my $c (@{$a->{$b}}){
                        print "$b.$c => $c\n";
                    }
                } elsif ($a->{$b} =~ /^CODE/){
                    print "$b => ". $a->{$b}() . "\n";
                } else {
                    print "$b => $a->{$b}\n";
                }
            }
        }
        

        【讨论】:

          猜你喜欢
          • 2012-09-06
          • 1970-01-01
          • 2021-02-15
          • 2019-06-01
          • 2014-09-18
          • 2011-04-20
          • 2018-02-25
          • 2011-05-07
          • 2015-01-17
          相关资源
          最近更新 更多