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