perl - 为什么将 Perl 哈希值添加为键?

标签 perl

我有一个哈希 my %read_data = ();
我正在尝试建立这样的键和值

$read_data{"status"} = 0;
$read_data{"suffix"} = "_SP";
$read_data{"consumption"} = 95;

我所看到的如下,我无法弄清楚我做错了什么。
Key=status
Key=0
Key=suffix
Key=_SP
Key=consumption
Key=95

我正在使用
for my $k1 (%read_data)
{
  print "Key=".$k1."\n";
}

最佳答案

您正在使用的数组和散列之间存在关系:

my %hash = ( one => 1, two => 2, three => 3 );

这将创建一个三成员散列,键为 one , two ,和`三。这样做也是如此:
my %hash = ( "one", 1, "two", 2, "three", 3 );

事实上,这两行是完全相同的语句。 =>是一种语法糖,用于突出一个值与另一个值之间的关系。这里又是同一行。我只是在弄乱你的大脑,但它产生与以前相同的哈希值:
my %hash = ( "one", 1 => "two", 2 => "three", 3 );

这是分配相同散列的另一种方法:
my @array = ( "one", 1, "two", 2, "three", 3 );
my %hash = @array;

这也是有效的:
my @array = %hash;

Perl 中散列和数组之间有很强的关系。如果在散列上下文中使用数组,它将成为散列。如果在数组上下文中使用散列,它就会变成一个数组。
例如:
 mysub (%hash);

sub mysub {
    my %subhash = @_;
    ...
}

这是将散列传递给子例程的有效(虽然不推荐的方式)。散列被翻译成 @_然后在子例程中将数组转换回散列。

让我们来看看你的循环:
for my $k1 (%read_data) {
(...)是一个列表/数组上下文,因此会占用您的 %read_data散列,并将其呈现在列表上下文中,每个键后跟其值。

有几种方法可以解决这个问题。一种是使用keys提取散列中的所有键并返回键数组。这通常与 sort 结合使用将键排序为某种顺序。
for my $k1 ( sort keys %read_data ) {

另一种是使用each它返回一系列具有一个键和一个值的两个成员数组。

关于perl - 为什么将 Perl 哈希值添加为键?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18384362/

相关文章:

perl - Perl中的map函数是如何实现的?

perl - 如何防止 Perl CGI->start_html() 打印 DOCTYPE header

JavaScript 相当于 Perl 的 AUTOLOAD

perl - 从 perl 确定父 shell

Javascript:/e Javascript 中 RegExp 的修饰符

perl - 为什么 TWiki 无法找到已在 @INC 中的模块?

传递给子例程时Perl引用和延迟哈希值?

mysql - DBIC 加入 Catalyst Web 应用程序

html - Perl -> HTML 多项选择解析器

Perl 语言环境警告 Debian