【问题标题】:Access the key value from an associative array从关联数组中访问键值
【发布时间】:2016-08-13 14:09:24
【问题描述】:

我有关联数组%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 新手。谢谢

【问题讨论】:

  • 术语说明:在 Perl 中,关联数组通常称为哈希。
  • @ThisSuitIsBlackNot 谢谢,值得更新标题吗?
  • 我认为这很好。它可能会帮助不熟悉 Perl 术语的人找到问题。
  • 关于关联数组——这是一个可怕的数据结构名称。普通的整数索引数组是“关联的”——它们将整数与值相关联。 Python 使用 dictionary,而 Ruby 和 Perl 使用 hash;两者都可以接受。在 JavaScript、PHP 和 Lua 中,聚合数据的行为类似于数组和字典。它们被称为数组,它们都具有决定如何存储每个值的内部 DWIM 软件。 符号表hash map也是可以接受的,但据我所知,没有一种语言正式称它们为关联数组
  • 在 Perl 5 发布之前,它们被称为“关联数组”。当我看到 Perl 程序员使用这个短语时,我担心他们是从非常过时的资源中学习 Perl 的。

标签: arrays perl hashmap


【解决方案1】:

我想你在要求

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

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

【讨论】:

    【解决方案2】:

    如果您只是在寻找与密钥相关的值,您可以使用each 同时获得两者:

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

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

    我还更改了“元”检查以使用简单的字符串相等;无需使用正则表达式进行精确匹配。

    【讨论】:

      【解决方案3】:

      你的原始代码有

      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             
      }
      

      【讨论】:

        猜你喜欢
        • 2013-05-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多