Perl哈希和数组

Sen*_*mar 2 perl hash

我有一个包含28个元素的数组.

我将数组内容复制到哈希中.

如果我尝试打印哈希,它不会显示所有键和值.

代码如下,

@new;
%hash = @new;
foreach $food (keys %hash) 
{
 $color = $hash{$food};
 print "$food is $color.\n";
}
Run Code Online (Sandbox Code Playgroud)

输出是::

attribute is Mandatory.
min is 0X00.
value is 778.
max is 9940486857.
name is Security_header.
type is nibble.
Run Code Online (Sandbox Code Playgroud)

数组@new内容是,

name Protocol_discriminator attribute Mandatory value 778 min 0X00 max 994048685 value 7 min 0 max F name Security_header attribute Mandatory type nibble value 778 min 0X00 max 9940486857
Run Code Online (Sandbox Code Playgroud)

如果我尝试遍历散列,我希望将数组的所有内容复制到散列中并进行打印.但有些如何只将部分数组内容复制到哈希中.

任何人都可以帮助克服这个问题.我过去两天都在苦苦挣扎.

谢谢Senthil.

Que*_*tin 6

您有多个具有相同名称的键,因此您将覆盖数据.

你需要重新思考你的方法.

可能你需要一个更智能的算法来构造你的哈希(例如将值放在数组ref而不仅仅是一个简单的值).可能你需要忘记哈希,只需用一个for循环遍历数组,每次循环增加2.


Gre*_*con 6

让我们更改演示文稿@new以显示正在发生的事情:

my @new = qw/
  attribute Mandatory
  attribute Mandatory
  max       994048685
  max       9940486857
  max       F
  min       0
  min       0X00
  min       0X00
  name      Protocol_discriminator
  name      Security_header
  type      nibble
  value     7
  value     778
  value     778
/;
Run Code Online (Sandbox Code Playgroud)

Perl哈希键是唯一的,因此在分配@new%hash,给定键的最后一个值"获胜".对于一个简单的例子

$ perl -le '%h = qw/1 a 1 b 1 c/; print $h{1}'
c

假设您有相同密钥的许多值,请使用可以处理它的数据结构:

my %hash;
for (my $i = 0; $i < @new; $i += 2) {
  my($name,$val) = @new[$i,$i+1];
  push @{ $hash{$name} } => $val;
}
Run Code Online (Sandbox Code Playgroud)

如果你不介意破坏@new,代码可能会更加惯用:

while (@new) {
  my($name,$val) = splice @new, 0, 2;
  push @{ $hash{$name} } => $val;
}
Run Code Online (Sandbox Code Playgroud)

这意味着与给定键相关联的每个值%hash都是对值数组的引用.所述push运营商期望的阵列,而不是一个参考,所以我们使用@{ ... }取消引用它.

如果您不熟悉Perl引用,请务必阅读perlrefperllol文档.

打印值的一种方法%hash

foreach my $name (sort keys %hash) {
  print "$name = [@{ $hash{$name} }]\n";
}
Run Code Online (Sandbox Code Playgroud)

输出:

attribute = [Mandatory Mandatory]
max = [994048685 9940486857 F]
min = [0 0X00 0X00]
name = [Protocol_discriminator Security_header]
type = [nibble]
value = [7 778 778]

Another handy trick for printing and debugging complex data structures is the Data::Dumper module:

use Data::Dumper;
print Dumper \%hash;
Run Code Online (Sandbox Code Playgroud)

which prints

$VAR1 = {
          'attribute' => [
                           'Mandatory',
                           'Mandatory'
                         ],
          'value' => [
                       '7',
                       '778',
                       '778'
                     ],
          'min' => [
                     '0',
                     '0X00',
                     '0X00'
                   ],
          'name' => [
                      'Protocol_discriminator',
                      'Security_header'
                    ],
          'max' => [
                     '994048685',
                     '9940486857',
                     'F'
                   ],
          'type' => [
                      'nibble'
                    ]
        };
Run Code Online (Sandbox Code Playgroud)