Perl 如何创建数组的散列或散列的散列

Perl 如何创建数组的散列或散列的散列,perl,hash,Perl,Hash,我有一个名为Jobs.conf的文件,其中包含: JobName: A JobSize: 100 JobArrival:1 JobExe:100 JobName: B JobSize: 100 JobArrival:2 JobExe:100 JobName: C JobSize: 100 JobArrival:3 JobExe:100 JobName: D JobSize: 100 JobArrival:4 JobExe:100 是否可以读取此文件,使每个作业存储在一个数组

我有一个名为Jobs.conf的文件,其中包含:

JobName: A  
JobSize: 100
JobArrival:1
JobExe:100  

JobName: B
JobSize: 100
JobArrival:2
JobExe:100 

JobName: C
JobSize: 100
JobArrival:3
JobExe:100

JobName: D
JobSize: 100
JobArrival:4
JobExe:100  

是否可以读取此文件,使每个作业存储在一个数组中,然后将4个数组存储在一个哈希中?将其存储为散列会更有意义吗?可能吗?

关键是要正确设置
$/
(The):

这影响了Perl关于“行”是什么的概念。像awk的RS一样工作 变量,包括将空行视为终止符(如果设置为 空字符串(空行不能包含任何空格或制表符)。你可以 将其设置为多字符字符串以匹配多字符 终止符,或到
undef
读取文件结尾。设置它 to
“\n\n”
的意思与设置为
略有不同, 如果文件包含连续的空行。设置为
将 将两个或多个连续的空行视为一个空行。 设置为
“\n\n”
将盲目地假定下一个输入字符 属于下一段,即使是换行

然后,我们只需利用
直接拆分为散列引用的方式来排列记录:

use strict;
use warnings;

use Data::Dump;

local $/ = "";
my @jobs;

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

dd(\@jobs);

__DATA__
JobName: A
JobSize: 100
JobArrival:1
JobExe:100

JobName: B
JobSize: 100
JobArrival:2
JobExe:100

JobName: C
JobSize: 100
JobArrival:3
JobExe:100

JobName: D
JobSize: 100
JobArrival:4
JobExe:100
我倾向于使用散列数组(上一个示例),但如果需要散列数组,则需要稍微修改代码:

my %jobs;

while (<DATA>) {
    my %temp = split(/:\s*|\n/);
    $jobs{delete($temp{JobName})} = \%temp;
}

dd(\%jobs);

你两者都可以。关于如何创建数组的散列或散列的散列,有大量的资源。您是否尝试过其中任何一种方法?存储数据的最佳方法取决于您打算如何使用它,以及数据本身的外观。例如,我可能会创建一个哈希数组,但是如果每个作业名称都保证是唯一的,那么在顶级键是作业名称的情况下,创建哈希可能会更容易。那么,您打算如何使用数据?@scrapsedcola我知道您可以创建散列。我的问题是如何在读取文件时执行此操作。我不知道如何存储这4行,然后当它到达作业B时,启动一个新的哈希。我只能将所有信息存储到一个数组中。@ThisSuiteisBlack不能保证作业名称是唯一的,这就是为什么我还认为哈希值的散列会更好。我正在尝试创建一个内存管理器,以便将这些作业传递到我将创建的伪ram文件中,然后根据所选分区的类型,它将运行“处理”作业的模拟。这正是我所需要的。非常感谢。如何将本地$/设置回其默认值?一旦我读了这个文件,我想读另一个文件,因为本地$/它没有正确存储。我已尝试将其设置为undef和“\n\n”,但由于没有段落空格,它仍然无法正确存储下一个哈希。@SilentUK默认值为换行符,但您可能只想
$/
到块。。。
[
  { JobArrival => 1, JobExe => 100, JobName => "A", JobSize => 100 },
  { JobArrival => 2, JobExe => 100, JobName => "B", JobSize => 100 },
  { JobArrival => 3, JobExe => 100, JobName => "C", JobSize => 100 },
  { JobArrival => 4, JobExe => 100, JobName => "D", JobSize => 100 },
]
my %jobs;

while (<DATA>) {
    my %temp = split(/:\s*|\n/);
    $jobs{delete($temp{JobName})} = \%temp;
}

dd(\%jobs);
{
  A => { JobArrival => 1, JobExe => 100, JobSize => 100 },
  B => { JobArrival => 2, JobExe => 100, JobSize => 100 },
  C => { JobArrival => 3, JobExe => 100, JobSize => 100 },
  D => { JobArrival => 4, JobExe => 100, JobSize => 100 },
}