在 Perl 中按顺序打印哈希键

Posted

技术标签:

【中文标题】在 Perl 中按顺序打印哈希键【英文标题】:Print hash keys sequentially in Perl 【发布时间】:2022-01-19 16:41:36 【问题描述】:

我有哈希数组,需要迭代并打印序列中的值 - id,name,mailid

但是当我打印键的内容时,它一直在洗牌。如何打印如下内容:

ID,NAME,EMAIL
vkk,Victor,vkk@test.com
smt,Smith,smt@test.com

这是我的脚本:

my @data = (
             
                'mail' => 'vkk@test.com',
                'name' => 'Victor',
                'id' => 'vkk'
            ,
             
                'name' => 'Smith',
                'mail' => 'smt@test.com',
                'id' => 'smt'
            
);

print "ID,NAME,EMAIL\n"; #header

for $content (@data)
    for $fields (keys %$content)
        print $content->$fields.",";
    
    print "\n";

【问题讨论】:

for $fields qw(id name mail)?如果您知道所需的键顺序,那么您可以指定它。 @SilvioMayolo:谢谢,那行得通。但是打印逗号,时出现问题。 我在循环中添加了条件 - print "," if($fields ne 'mail'); 解决此问题的一种方法是不使用哈希。如果您只有 3 个字段,则最好使用数组作为值。 @Silvio Mayolo 那应该是for $fields (qw(id name mail))。曾经允许for $fields qw(id name mail) 的错误,但很久以前就已修复。 【参考方案1】:

keys() 的文档是这样说的:

哈希条目以明显随机的顺序返回。

因此,如果您想按特定顺序提取数据,则应指定该顺序。

for $content (@data)
    for $fields (qw(id name mail)) 
        print $content->$fields.",";
    
    print "\n";

或者使用哈希切片来简化代码:

for $content (@data) 
  print join(',', @$contentqw(id name mail)), "\n";

【讨论】:

@$contentqw(id name mail)也可以写成$content->@qw(id name mail) ^--- 仅在版本 5.20 之后。 perldoc.perl.org/perlref#Postfix-Dereference-Syntax

以上是关于在 Perl 中按顺序打印哈希键的主要内容,如果未能解决你的问题,请参考以下文章

小白学Perl之初始哈希

Perl的哈希知识点

在Objective C中按顺序保持JSON对象的字典键

Perl中的哈希hash介绍

使用 for 返回列表 10 次。我希望在每个循环中按顺序在屏幕上打印 2 个数字 [关闭]

在 Perl 中如何使用变量作为哈希键?