2016-02-27 45 views
0

我在perl中創建了一個名爲@jobs的數組。它是一個數組來存放我的工作列表的哈希值。在perl中移動一個未命名的散列?

我填充它,然後排序與下面的代碼另一個數組:

open(my $JOBLIST, '<:crlf', 'Jobs.conf') 
    or die "Unable to open file, $!"; 

#Store Hashes into jobs array 

while (<$JOBLIST>) { 
    push(@jobs, {split(/:\s*|\n/)}); 
} 

#sort jobs array by JobArrival 

my @sortJobs = sort { $a->{JobArrival} <=> $b->{JobArrival} } @jobs; 

如何訪問哈希在@sortJobs並將其移動到其他陣列等?我理解如何推動,但我不認爲這些哈希是命名的,所以我不確定我如何訪問它們?

編輯清晰:

我jobs.conf文件看起來像:

JobName: A 
JobSize: 100 
JobArrival: 4 
JobExe: 100 

JobName: C 
JobSize: 100 
JobArrival: 2 
JobExe: 100 

JobName: B 
JobSize: 100 
JobArrival: 3 
JobExe:100 

JobName: D 
JobSize: 100 
JobArrival: 1 
JobExe: 100 

當我已經整理它,我的哈希值的數組看起來像這樣:

[ 
    { JobArrival => 1, JobExe => 100, JobName => "D", JobSize => 100 }, 
    { JobArrival => 2, JobExe => 100, JobName => "C", JobSize => 100 }, 
    { JobArrival => 3, JobExe => 100, JobName => "B", JobSize => 100 }, 
    { JobArrival => 4, JobExe => 100, JobName => "A", JobSize => 100 }, 
] 

什麼我需要做的是從數組「D」中取出第一份工作,並將其移動到另一個數組中。一旦我完成了,我需要訪問下一個,並移動,直到我已經從這個數組中移動所有的哈希。

通常我會使用哈希名稱,但據我所見,這些哈希是未命名的,這使我感到困惑。

+0

訪問哈希引用本身很簡單('$ sortJobs [$ some_index]')。你在問如何訪問哈希中的字段? 「Jobs.conf」的外觀是什麼? – Kenney

+0

@Kenney我更新了主要帖子,希望它能讓我的意圖更清晰。 – SilentUK

+0

有一點,謝謝 - 只是遺漏了一些關於你想放置哈希的細節 - 基於什麼條件等等。我認爲你可以將第一個哈希從已排序的列表中移出並放到其他地方 - 但這可能太多了不重要的? – Kenney

回答

1

要複製@sortJobs到一個新的@queue你可以簡單地做

@queue = @sortJobs; 

要移動的元素,你可以做

while (@sortJobs) { 
    push @queue, shift @sortJobs; 
} 

這些都是相同的,不同之處在於@sortJobs將在第二空案件。

這裏我們使用shift函數從數組的'head'中移除一個元素,然後push將其追加。

注意不要緊什麼是在@sortJobs - 可能是標量,hashrefs,arrayrefs等。

這裏有一個例子,說明如何訪問在hashrefs的數據,把它們放在不同隊列:

while (@sortJobs) { 
    my $jobRef = shift @sortJobs;    # $job is a hashref 
    my %job = %{$jobRef};     # dereference it to a normal hash 

    if ($jobRef->{JobName} == 'D') {  # using the hashref 
     push @myDQueue, $jobRef; 
    } elsif ($job{JobName} == 'C') {  # using the hash 
     push @myCQueue, $jobRef; 
    } else { 
     push @myNormalQueue, $jobRef; 
    } 
} 

更多在此PerlRefTut

+0

謝謝,這是我需要的。我怎樣才能一次完成一個散列而不是一次移動整個內容? – SilentUK

+0

這就是'while'的意思 - 'push @queue,shift @ sortJobs'只能移動1個元素。 – Kenney

+0

非常感謝@kenney – SilentUK