perl - 如何在 Perl 中保留散列的顺序?

标签 perl hash

我有一个 .sql 文件,我正在从中读取我的输入。假设文件包含以下输入....

Message Fruits Fruit="Apple",Color="Red",Taste="Sweet";

Message Flowers Flower="Rose",Color="Red";

现在我已经编写了一个 perl 脚本来从这个文件生成哈希。
use strict;
use Data::Dumper;

if(open(MYFILE,"file.sql")){
    my @stack;
    my %hash;
    push @stack,\%hash;
    my @file = <MYFILE>;
    foreach my $row(@file){
        if($row =~ /Message /){
            my %my_hash;
            my @words = split(" ",$row);
            my @sep_words = split(",",$words[2]);

            foreach my $x(@sep_words){
                my($key,$value) = split("=",$x);
                $my_hash{$key} = $value;
            }
            push @stack,$stack[$#stack]->{$words[1]} = {%my_hash};
            pop @stack;
        }
    }
    print Dumper(\%hash);
}

我得到以下输出..
$VAR1 = {
          'Flowers' => {
                         'Flower' => '"Rose"',
                         'Color' => '"Red";'
                       },
          'Fruits' => {
                        'Taste' => '"Sweet";',
                        'Fruit' => '"Apple"',
                        'Color' => '"Red"'
                      }
        };

现在这里的散列不保留读取输入的顺序。我希望我的散列与输入文件中的顺序相同。
我找到了一些像 Tie::IxHash 这样的库,但我想避免使用任何库。有人能帮我吗???

最佳答案

对于低调的方法,您始终可以将键维护在一个数组中,该数组确实有顺序。

foreach my $x(@sep_words){
    my($key,$value) = split("=",$x);
    $my_hash{$key} = $value;
    push(@list_keys,$key);
}

然后提取,迭代键
foreach my $this_key (@list_keys) {
    # do something with $my_hash{$this_key}
}

但这确实存在问题,您依赖于键数组和哈希保持同步。如果您不小心,您也可能不小心多次添加相同的 key 。

关于perl - 如何在 Perl 中保留散列的顺序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14691881/

相关文章:

perl - 如何重新加载催化剂中的配置

Perl $_嵌套循环中的变量工作机制

Ruby 嵌套哈希合并

java - 为什么我们需要在哈希表键匹配中进行更多查找?

mysql - perl 在脚本中打包 dbd mysql 模块

arrays - 在 Perl 中,如何在不查看数组大小的情况下检测(绑定(bind))数组是否为空?

perl - perl 中 "\c"的用途是什么?

performance - 从python中的列表中获取哈希的最快方法

hash - OpenSSL passwd 哈希不一致

c# - 我如何在我的 ASP.Net 应用程序上使用 salting+hashing?