perl 将多个值添加到现有哈希中

o7jaxewo  于 8个月前  发布在  Perl
关注(0)|答案(5)|浏览(94)

我有下面的散列,我想给它添加更多的值;然而,这样做会替换整个散列。我很确定这是一个基本的问题,但perl是一个神秘的谜。

my %myNewHash = ();

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

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

此时,%myNewHash只包含email/phone,lastName/firstName都被抹掉了。

fhg3lkii

fhg3lkii1#

现有的hash(注意,在赋值之前不需要创建空hash):

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

因为你在新的和旧的哈希中使用相同的键:

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

或者使用hash slice:

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

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

$hash{key} = ...

而不是散列本身

%hash = ( ... );
deikduxw

deikduxw2#

这里有一个方法可以做到这一点:

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};
6tqwzwtp

6tqwzwtp3#

每当你这样做:

%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,但我一时想不出来。

wz8daaqr

wz8daaqr4#

尝试添加如下内容:

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

68bkxrlz5#

我会通过对散列进行“切片”来做到这一点。将sigil @放在散列名称的前面(这表明您使用了散列的一个切片),在花括号中提供新的键(这表明您引用的是散列及其单个条目),然后只需为新条目分配值

@myNewHash{"email", "phone"} = ("[email protected]", "+122222222222");

相关问题