Perl 按顺序遍历散列

Perl 按顺序遍历散列,perl,hash,Perl,Hash,我想逐个遍历散列。不是随机的。任何想法。例如,我有这样的散列文件 our %HASH = ( 'rajesh:1700' => Bangalore, 'rajesh:1730' => Delhi, 'rajesh:1770' => Ranchi, 'rajesh:1780' => Mumbai, 'rajesh:1800' => MYCITY, 'rajesh:1810' => XCF, ); 它应该以同样的方式打印。我试着跟随,但失

我想逐个遍历散列。不是随机的。任何想法。例如,我有这样的散列文件

our %HASH = (
'rajesh:1700'  =>  Bangalore,
'rajesh:1730'  =>  Delhi,
'rajesh:1770'  =>  Ranchi,
'rajesh:1780'  =>  Mumbai,
'rajesh:1800'  =>  MYCITY,
'rajesh:1810'  =>  XCF,
);
它应该以同样的方式打印。我试着跟随,但失败了。有什么想法吗

while ( my $gPort = each %HASH)
{
    print "$gPort\n";
}


for my  $gPort ( keys %HASH )
{
    print "$gPort\n";
}

给定问题中的键,对排序比较器进行简单的更改将得到所需的输出

for my $gPort (sort keys %HASH) {
  print "$gPort => $HASH{$gPort}\n";
}

注意:上述代码假设键中的所有数字都出现在相同的位置,且长度相同。例如,一个
rajesh:001775
键将首先出现,而不是在1770和1780之间出现。

您可以按值(而不是键)排序并打印哈希

用于我的$gPort(排序{$HASH{$a}$HASH{$b}}键%HASH){
打印“$gPort=>$HASH{$gPort}\n”;
}
看一看。特别是,如果设置
$Data::Dumper::Sortkeys
,则将按排序顺序获取转储

例如:

use Data::Dumper;
$Data::Dumper::Sortkeys = 1;

my %some_hash;

# code to populate hash
[ . . . ]

print Dumper(\%some_hash);
当然,只有当您希望明确地转储散列时,这才有效。如果希望以其他格式进行打印,则只需对键进行排序并打印,如

foreach my $key (sort keys %some_hash) {
    print "[KEY]: $key; [VAL]: $some_hash{$key}\n";
}

如果希望保留散列中元素的插入顺序,则可能是适合您的工具。它的用法非常简单:

向您展示一个简单的示例:

    use Tie::IxHash;        
    tie my %days_in => 'Tie::IxHash',
            January   => 31,
            February  => 28,
            March     => 31,
            April     => 30,
            May       => 31,
            June      => 30,
            July      => 31,
            August    => 31,
            September => 30,
            October   => 31,
            November  => 30,
            December  => 31;       


      print join(" ", keys %days_in), "\n";        
    # prints: January February March April May June July August
    # September October November December

如果文件内容有这样的散列rajesh:2130 rajesh:1780 rajesh:2060 rajesh:1810 rajesh:1700,则其不起作用。预期结果为rajesh:1700 rajesh:1780 rajesh:1810 rajesh:1810 rajesh:2060 rajesh:2130您不能在散列中重复密钥;散列的要点是查找唯一键并检索关联的值。如果您只想存储有序对,请使用数组。是的,我们不能。我只给了您密钥列表。我的意思是这是一个键--“rajesh:1700”@RajeshKumar请编辑你的问题,包括你在输入中可能遇到的不同键的样本。刚刚编辑。希望现在一切都好。
    use Tie::IxHash;        
    tie my %days_in => 'Tie::IxHash',
            January   => 31,
            February  => 28,
            March     => 31,
            April     => 30,
            May       => 31,
            June      => 30,
            July      => 31,
            August    => 31,
            September => 30,
            October   => 31,
            November  => 30,
            December  => 31;       


      print join(" ", keys %days_in), "\n";        
    # prints: January February March April May June July August
    # September October November December