2016-02-27 44 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