gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 15:52:19 25 4
gpt4 key购买 nike

我有一个 .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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com