在Perl中,我们可以在散列中为同一个键输入两个值而不丢失(覆盖)第一个值吗?

在Perl中,我们可以在散列中为同一个键输入两个值而不丢失(覆盖)第一个值吗?,perl,hash,Perl,Hash,在我用perl声明一个散列之后 %hash1=(a=>"turkey", b=>"india", c=>"england", d=>"usa") 如果我为已经存在的键指定一个新值,如 $hash1{d}="australia"; 我正在丢失键“d”即“usa”的上一个值,因为当我这样做时 print %hash1; 我看不到值“usa”…如何为同一个键保留这两个值 您需要存储列表的散列 例如: 您需要存储列表的散列 例

在我用perl声明一个散列之后

%hash1=(a=>"turkey",
        b=>"india",
        c=>"england",
        d=>"usa")
如果我为已经存在的键指定一个新值,如

$hash1{d}="australia";
我正在丢失键“d”即“usa”的上一个值,因为当我这样做时

print %hash1;

我看不到值“usa”…如何为同一个键保留这两个值

您需要存储列表的散列

例如:
您需要存储列表的散列

例如:

散列键只能包含单个标量值,因此如果该值是字符串,则每个键只能包含一项。但是,没有什么可以阻止您将数组引用(也是标量)存储为值。为了让事情变得更简单,您可能应该只存储数组引用或字符串,而不是混合存储这两者:

my %hash1 = (a=>"turkey", b=>"india", c=>"england", d=>"usa");

# upgrade all values to arrays
# $hash1{$_} = [$hash1{$_}] for keys %hash1;   # a way with `keys`
$_ = [$_] for values %hash1;  # a better way with `values`, thanks to ysth

push @{ $hash1{d} }, 'australia';

print "$_ : @{ $hash1{$_} }\n" for keys %hash;

散列键只能包含单个标量值,因此如果该值是字符串,则每个键只能包含一项。但是,没有什么可以阻止您将数组引用(也是标量)存储为值。为了让事情变得更简单,您可能应该只存储数组引用或字符串,而不是混合存储这两者:

my %hash1 = (a=>"turkey", b=>"india", c=>"england", d=>"usa");

# upgrade all values to arrays
# $hash1{$_} = [$hash1{$_}] for keys %hash1;   # a way with `keys`
$_ = [$_] for values %hash1;  # a better way with `values`, thanks to ysth

push @{ $hash1{d} }, 'australia';

print "$_ : @{ $hash1{$_} }\n" for keys %hash;

正如JohnSmith所说,使用数组散列:

my %hash1 = (
    a => ["turkey"],
    b => ["india"],
    c => ["england"],
    d => ["usa"],
);
并将其用作:

push @{$hash1{d}}, "australia";

正如JohnSmith所说,使用数组散列:

my %hash1 = (
    a => ["turkey"],
    b => ["india"],
    c => ["england"],
    d => ["usa"],
);
并将其用作:

push @{$hash1{d}}, "australia";

这个问题完全等同于问,如果我们先给一个变量分配一个只能包含一个值的特定值,然后给同一个变量分配一个不同的值,我们是否可以访问刚才覆盖的较早的值


同样的答案也适用于这两种情况:不,当然不是,不改变存储类、访问机制或两者。一意味着一。当你提出了一种机制来处理一个简单的未被订阅的标量变量时,你就可以解决整个问题了。

这个问题就相当于问如果我们首先分配一个变量,它只能保存一个值或者某个特定值,但随后,我们会给同一个变量分配一个不同的值,不管我们是否能够访问刚才覆盖的较早的值


同样的答案也适用于这两种情况:不,当然不是,不改变存储类、访问机制或两者。一意味着一。当你想出一种机制来处理一个简单的未订阅的标量变量时,你就可以解决整个问题。

没有列表哈希。@friedo语言是灵活的。他说的散列存储数组而不是简单的标量作为值,这是合理的。@friedo:如果不是列表,那么数组保存的是什么呢?在我看来,必须总是背诵“一个标量散列,其中包含对数组的引用,数组中包含未知内容类型的标量列表”,这是有点冗长。对那些在随意的谈话中漏掉一些的人来说,很难太严厉。“数组散列”很好,因为Perl没有其他相同的实现,而“列表散列”只是删除了一步。事实上,同样的观点也适用于这里,因为没有其他方法可以做到这一点。@frido,我不同意。约翰史密斯的说法没有错,只是没有用。它只是重复了Siddharth的问题,而没有建议如何在散列元素中存储列表。另一方面,他的链接显示了如何使用对数组的引用来存储该列表。@Axeman,是的,语言是灵活的,但在某些情况下,语言必须精确。在编程中,我们对日常语言中的同义词有非常具体的定义。特别是在Perl中,数组和列表是两种完全不同的东西。没有列表散列这种东西。@friedo语言是灵活的。他说的散列存储数组而不是简单的标量作为值,这是合理的。@friedo:如果不是列表,那么数组保存的是什么呢?在我看来,必须总是背诵“一个标量散列,其中包含对数组的引用,数组中包含未知内容类型的标量列表”,这是有点冗长。对那些在随意的谈话中漏掉一些的人来说,很难太严厉。“数组散列”很好,因为Perl没有其他相同的实现,而“列表散列”只是删除了一步。事实上,同样的观点也适用于这里,因为没有其他方法可以做到这一点。@frido,我不同意。约翰史密斯的说法没有错,只是没有用。它只是重复了Siddharth的问题,而没有建议如何在散列元素中存储列表。另一方面,他的链接显示了如何使用对数组的引用来存储该列表。@Axeman,是的,语言是灵活的,但在某些情况下,语言必须精确。在编程中,我们对日常语言中的同义词有非常具体的定义。特别是在Perl中,数组和列表是两种截然不同的东西。
$$$[$\\\]对于值%hash1
@ysth=>nice,我忘记了与返回副本的
键不同,
值返回左值列表。
$$[$\\\]对于值%hash1
@ysth=>nice,我忘记了与返回副本的
键不同,
values
返回左值列表。