我有一个包含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.
您有多个具有相同名称的键,因此您将覆盖数据.
你需要重新思考你的方法.
可能你需要一个更智能的算法来构造你的哈希(例如将值放在数组ref而不仅仅是一个简单的值).可能你需要忘记哈希,只需用一个for循环遍历数组,每次循环增加2.
让我们更改演示文稿@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引用,请务必阅读perlref和perllol文档.
打印值的一种方法%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)
| 归档时间: |
|
| 查看次数: |
458 次 |
| 最近记录: |