从关联数组

时间:2016-04-20 17:54:54

标签: arrays perl hashmap

我有关联数组%cart_item,其中包含一系列关联数组。我需要访问%cart_item中的键值。我有以下代码迭代每个数组键。 (如果价值是' meta')我会相当于php继续

my $key_value;
for (keys %cart_item) {
   next if (/^meta$/ || /^\s*$/);

}

我需要做这样的事情(尽管这不是有效的),在循环中设置键的值:

my $key_value;
for $i (keys %cart_item) {
   next if (/^meta$/ || /^\s*$/);
   $key_value = $i; 
   # do stuff             
}

有人可以在这提出解决方案吗?抱歉,如果这很明显,我是一个Perl新手。感谢

3 个答案:

答案 0 :(得分:3)

我想你要求

for my $key (keys %cart_item) {
   next if $key =~ /^meta$/ || $key =~ /^\s*$/;

   my $val = $cart_item{$key};
   ...
}

答案 1 :(得分:2)

如果您只是在寻找密钥的价值,那么您可以使用each同时获取两者:

while (my ($key, $val) = each %cart_item) {
  next if $key eq 'meta' || $key =~ /^\s*$/;
  ...
} 

这相当于PHP的foreach ($cart_item as $key => $val)

我也改变了" meta"检查使用简单的字符串相等;无需使用正则表达式进行完全匹配。

答案 2 :(得分:1)

您的原始代码

for ( keys %cart_item ) {
   next if (/^meta$/ || /^\s*$/);
}

工作正常,因为for没有循环控制变量,所以它默认为Perl"代词" it 变量$_。此外,您的正则表达式模式匹配没有对象,因此它们也默认为$_

完全写完,这将是

for $_ ( keys %cart_item ) {
   next if ( $_ =~ /^meta$/ || $+ =~ /^\s*$/);
}

但我们不必写所有这些。有些人讨厌它;像我这样的其他人认为它是绝对的天才

您的非工作代码

my $key_value;

for $i (keys %cart_item) {
   next if (/^meta$/ || /^\s*$/);
   $key_value = $i; 
   # do stuff             
}

使用循环控制控制变量$i(顺便说一下,散列键的名称错误)。除了你的正则表达式匹配之外,这一切都很好

my $key_value;

for $i (keys %cart_item) {
   next if $i =~ /^meta$/ or $i =~ /^\s*$/;
   $key_value = $i; 
   # do stuff             
}

或者,更好的是,坚持$_并写下这个

for ( keys %cart_item ) {
   next if /^meta$/ or /^\s*$/;
   my $key_value = $_; 

   # do stuff             
}