perl - 推送(哈希)的奇怪行为
问题描述
我完全理解哈希是未排序的,但我的印象是它始终保持键/值关系。
我根本不理解这种行为。当我从数组推送时,进行一些重复数据删除,然后打印键、子键和值,我得到了想要的结果:
my @Input = ("Crockery breakable plates",
"Crockery breakable glasses",
"Cutlery bendable forks",
"Cutlery bendable spoons"
);
my %store = ();
foreach (@Input) {
my ($key, $key2, $value) = split;
chomp ($key, $key2, $value);
my $combine = "$key-$key2-$value";
push @arr, "$key-$key2-$value";
# push @{$store{$combine}}, "$key-$key2-$value";
}
foreach (@arr) {
($key, $key2, $value) =split /-/;
chomp ($key, $key2, $value);
$seen{$key}++ || print "1. $key\n";
$seen{$key2}++ || print "2. -- $key2\n";
$seen{$value}++ || print "3. ----$value\n";
}
每次都会打印出来:
1. Crockery
2. -- breakable
3. ----plates
3. ----glasses
1. Cutlery
2. -- bendable
3. ----forks
3. ----spoons
然后我做基本相同的事情,但推动
my @Input = ("Crockery breakable plates",
"Crockery breakable glasses",
"Cutlery bendable forks",
"Cutlery bendable spoons"
);
my %store = ();
foreach (@Input) {
my ($key, $key2, $value) = split;
chomp ($key, $key2, $value);
my $combine = "$key-$key2-$value";
# push @arr, "$key-$key2-$value";
push @{$store{$combine}}, "$key-$key2-$value";
}
foreach my $k(keys %store) {
($key, $key2, $value) = split /-/, $k;
chomp ($key, $key2, $value);
$seen{$key}++ || print "1. $key\n";
$seen{$key2}++ || print "2. -- $key2\n";
$seen{$value}++ || print "3. ----$value\n";
}
每次打印随机结果:
1. Cutlery
2. -- bendable
3. ----forks
1. Crockery
2. -- breakable
3. ----plates
3. ----spoons < --- not Crockery
3. ----glasses
这里唯一真正的区别(我可以看到)是我拆分了键名,但该布局仍然与数组名相同。
所以问题是,有人可以帮助我理解为什么以及如何解决这个问题吗?
PS!!我问这个问题的原因是,我想在我的脚本中拆分我的键名,而不是推送另一个数组,因为我已经推送了一次这个键名,因为我在脚本的另一部分使用它。
解决方案
||
从结构中删除$seen{something}++ || print ...
,您将看到输出是正确的。
...
foreach my $k(keys %store) {
($key, $key2, $value) = split /-/, $k;
chomp ($key, $key2, $value);
$seen{$key}++ && print "*"; print "1. $key\n";
$seen{$key2}++ && print "*"; print "2. -- $key2\n";
$seen{$value}++ && print "*"; print "3. ----$value\n";
}
1. Cutlery
2. -- bendable
3. ----forks
1. Crockery
2. -- breakable
3. ----glasses
*1. Cutlery
*2. -- bendable
3. ----spoons
*1. Crockery
*2. -- breakable
3. ----plates
任何以新脚本开头的行都*
不会在原始脚本中输出。
请注意,如果您对 的键进行排序%store
,则第二个键和值将始终与正确的第一个键相关联,如您所愿:
foreach my $k (sort keys %store) {
# ^^^^
($key, $key2, $value) = split /-/, $k;
chomp ($key, $key2, $value);
$seen{$key}++ || print "1. $key\n";
$seen{$key2}++ || print "2. -- $key2\n";
$seen{$value}++ || print "3. ----$value\n";
}
1. Crockery
2. -- breakable
3. ----glasses
3. ----plates
1. Cutlery
2. -- bendable
3. ----forks
3. ----spoons
尽管我猜如果相同的值或 key2 与多个键相关联,您仍然会感到困惑。
推荐阅读
- ios - PKPaymentAuthorizationController 委托未调用
- python - 正则表达式循环在 60 次迭代后停止
- angular - 角。数字证书
- acumatica - 页面加载后按条件重定向 Acumatica ERP
- android - Android Studio Layout Design 编辑器问题
- java - 如何使用 JUnit 和 Mockito 通过静态 util 调用测试 Rest Controller
- x86 - 使用 AVX512 生成掩码的 BMI
- sass - 在 Sass if-check 中应用媒体查询不起作用
- azure - Azure AD Graph - 使用应用程序凭据流创建 AppRole
- ocaml - 使用从元组列表中提取的数据创建一个列表 - 类型问题