具體地說我的數據結構如下所示如何使用子例程在複雜的數據結構上全局工作?
{
"SomeGuy" => {
date_and_time => "11-04-2013",
Id => 7,
nr => 52,
picks => [
{ "This is an option" => "Option3" },
{ "This is another option" => "Option4" },
{ "This is another option" => "Option1" },
{ "And another one" => "Something" },
],
time_of => "06:11 AM",
total => 1,
},
"Another Guy" => { ... },
}
這是輸出經由Data::Dump
。實際的數據結構包含更多的記錄,如"SomeGuy"
。所有這些結構都是相同的。
我填充這個數據結構是這樣的:
$guys->{$profile}{options}[$total++]{$var} = $var2;
$guys->{$profile}{Id} = $i;
$guys->{$profile}{date_and_time} = get_date($Time[0]);
$guys->{$profile}{time_of} = $Time[1];
$guys->{$profile}{total} = keys (% {$guys->{$profile}{options}[0]});
$guys->{$profile}{nr} = $pNr;
擁有這一切,我想接下來做的就是對這個數據結構進行操作。我重申,數據結構中有許多記錄。
當我輸出它的內容時,我得到它混亂的順序,而不是按它填充的順序。我已經用Data::Dumper
,Data::Dump
和我自己手動迭代記錄來嘗試。
我知道,在Data
命名空間的方法是臭名昭著的這一點,這就是爲什麼Data::Dumper
提供了一種方法,通過一個子程序進行排序,並Data::Dump
提供一個默認的。
所以我有數據結構。它看起來像我期望的那樣,我知道所有的數據,因爲我知道它應該看起來有效。我想根據他們的Id
字段對記錄進行排序。我的想法是,我必須使用子例程,並基本上將數據結構的引用傳遞給它並在那裏進行排序。
sub sortt {
my $dref = shift @_;
foreach my $name (sort { $dref->{$a}{Id} <=> $dref->{$b}{Id} } keys %$dref) {
print "$data->{$name}{Id}: $name \n";
}
}
調用此方法同(在填充結構相同的範圍內,所以不用擔心有):
sortt(\$guys);
的錯誤是:
Not a HASH reference at perlprogram.pl line 452
所以我去在子程序中使用ref
以確保我傳遞了實際參考。它說REF
。
接下來,我進入絕望的模式,並嘗試像調用它的一些愚蠢的事情:
sortt(\%$guys)
但是如果我沒有弄錯這只是發送一個拷貝到子程序只是在本地複製排序,所以那裏沒有用處。
如果我從子程序中創建一個副本並將其返回,我只想傳遞一個我的數據結構的引用並對其進行排序並使其反映全局(或調用範圍本身)中的這些更改是沒有用的。我將如何做到這一點?
要排序的鑰匙,但你用排序鍵做的是打印出來。你想改變* hash元素的順序*,但這是不可能的。你真的應該知道什麼是[hash](http://en.wikipedia。org/wiki/Hash_table)是。 – ikegami