【问题标题】:perl Hash Data Type list orderperl 哈希数据类型列表顺序
【发布时间】:2017-01-26 11:43:00
【问题描述】:
#!/usr/bin/perl
%mylist=("svrmlb"=>"10.0.0.1","svrcmb"=>"10.0.0.2","svrkdy"=>"10.0.0.3");

print("key-val\n");
for $x (keys(%mylist))
{
    print ("$x:$mylist{$x}\n");
}

print("\nvals\n");
for $x (values(%mylist))
{
    print ("$x\n");
}

当我编译上面的代码时,我得到以下输出

key-val
svrcmb:10.0.0.2
svrkdy:10.0.0.3
svrmlb:10.0.0.1

vals
10.0.0.2
10.0.0.3
10.0.0.1

但我的预期输出是

 key-val
 svrmlb:10.0.0.1
 svrcmb:10.0.0.2
 svrkdy:10.0.0.3

 vals
 10.0.0.1
 10.0.0.2
 10.0.0.3

我的问题是为什么它被排序,我没有对键或值应用排序。这是哈希的特征吗?早些时候,我尝试对其他几个散列数组进行排序,但它们不是这样的。请帮我理解。

【问题讨论】:

  • 运行几次,你可能每次都有不同的输出。那应该回答你的问题。
  • 是的,顺序正在改变,这意味着键不在列表中的顺序?
  • 关于“我没有对键或值应用排序”,没错。您根本没有指定订单。
  • @ikegami 现在我明白了!!!

标签: arrays perl sorting hash


【解决方案1】:

正如perldata 所说:

哈希是标量值的无序集合,由其关联的字符串键索引。

【讨论】:

    【解决方案2】:

    我能想到两个快速的解决方案: 1-将您的密钥存储在数组中; 2- 使用 Tie::IxHash; (这通常不会默认安装)

    %mylist=("svrmlb"=>"10.0.0.1","svrcmb"=>"10.0.0.2","svrkdy"=>"10.0.0.3");
    @mylist=("svrmlb","svrcmb","svrkdy");
    
    print("key-val\n");
    for $x (@mylist)
    {
        print ("$x:$mylist{$x}\n");
    }
    
    print("\nvals\n");
    for $x (@mylist)
    {
        print ("$mylist{$x}\n");
    }
    

    使用 Tie::IxHash

    use Tie::IxHash;
    %mylist=("svrmlb"=>"10.0.0.1","svrcmb"=>"10.0.0.2","svrkdy"=>"10.0.0.3");
    tie %mylist, 'Tie::IxHash';
    
    print("key-val\n");
    for $x (keys(%mylist))
    {
        print ("$x:$mylist{$x}\n");
    }
    
    print("\nvals\n");
    for $x (values(%mylist))
    {
        print ("$x\n");
    }
    

    【讨论】:

      猜你喜欢
      • 2013-05-19
      • 2012-03-30
      • 1970-01-01
      • 2016-10-14
      • 2022-01-19
      • 2013-01-31
      • 2021-09-29
      • 2015-01-18
      • 2010-10-20
      相关资源
      最近更新 更多