【问题标题】:Add multiple values to an already existing hash将多个值添加到已经存在的哈希
【发布时间】:2014-01-13 02:10:56
【问题描述】:

我有以下哈希,我想向它添加更多值;但是,这样做会替换整个哈希。我很确定这是一个基本级别的问题,但 perl 是一个谜团。

my %myNewHash = ();

%myNewHash = (
    lastName => $primaryInfo->{lastName},
    firstName => $primaryInfo->{firstName}
);

%myNewHash = (
    email => $primaryInfo->{email},
    phone => $primaryInfo->{phone}
);

此时,%myNewHash 只包含 email/phone,lastName/firstName 已被清除。

【问题讨论】:

  • 当你说$foo = 1;后跟$foo = 2;时,$foo的值是多少?哈希的工作方式相同。
  • 我知道 bash Perl 很时髦,但对任何人都没有帮助。我能想到的所有具有内置散列支持的语言都以相同的方式表现 - 将散列作为一个整体分配,然后您将内容作为一个整体进行更改 - 我找不到更好的方法。如果您按照自己的方式进行操作,那么 %myNewHash = () 将保持哈希不变,那么您如何清空它呢?
  • 在命令提示符处键入以下内容:perldoc perlintro。大约需要 20 分钟的阅读时间,它会解开谜团,只留下谜团...... ;)

标签: perl hash


【解决方案1】:

现有散列(注意在分配给它之前不需要创建一个空散列):

my %myNewHash = (
    lastName => $primaryInfo->{lastName},
    firstName => $primaryInfo->{firstName}
);

由于您在新旧哈希中使用相同的键:

$myNewHash{$_} = $primaryInfo->{$_} for qw(email phone);

或者使用哈希切片:

my @keys = qw(email phone);
@myNewHash{@keys} = @{ $primaryInfo }{@keys};

关键(双关语)是您分配给单个元素

$hash{key} = ...

而不是散列本身

%hash = ( ... );

【讨论】:

    【解决方案2】:

    这是一种方法:

    use strict;
    use warnings;
    
    my %myNewHash = (
        lastName  => $primaryInfo->{lastName},
        firstName => $primaryInfo->{firstName}
    );
    
    $myNewHash{email} =  $primaryInfo->{email};
    $myNewHash{phone} =  $primaryInfo->{phone};
    

    或者:

    use strict;
    use warnings;
    
    my %myNewHash;
    $myNewHash{lastName}  =  $primaryInfo->{lastName};
    $myNewHash{firstName} =  $primaryInfo->{firstName}
    $myNewHash{email}     =  $primaryInfo->{email};
    $myNewHash{phone}     =  $primaryInfo->{phone};
    

    【讨论】:

      【解决方案3】:

      无论何时:

      %myNewHash = ...;
      

      您正在重新初始化 %myNewHash 的值。这就是= 操作符的作用。与以下内容相同:

      my $var = "This is the first part of my sentence,";
      my $var = " and this is the last part of my sentence."; # Reinitializing $var, not appending it
      

      要解决此问题,您可以执行以下操作:

      %myNewHash = ( %myNewHash, email => $primaryInfo->{email}, phone => $primaryInfo->{phone} );
      

      在这种情况下,%myNewHash 中的键/值对被视为一个数组,另外两个键/值对被放入该数组并作为一个大数组分配给%myNewHash%myNewHash 已重新初始化,但现在包含它之前拥有的现有键/值对。

      我个人不会这样做,因为目前还不是 100% 清楚发生了什么。如果您想将哈希引用转换为哈希,您可以取消引用并一次性完成所有操作:

      my %myNewHash = %{ $primaryInfo };  # Easy to understand.
      

      或者使用一个循环来选择你想要转移的几个键:

      for my $key ( qw( email phone ) } {
          $myNewHash{$key} = $primaryInfo->{$key};
      }
      

      我确信甚至有一种方法可以使用 map,但我无法立即想到它。

      【讨论】:

        【解决方案4】:

        尝试像这样添加:

        %myNewHash = (
            %myNewHash,
            email => $primaryInfo->{email},
            phone => $primaryInfo->{phone}
        );
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2011-07-28
          • 2014-01-09
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-04-25
          • 2023-04-08
          相关资源
          最近更新 更多