如何创建数组哈希或哈希哈希

时间:2016-02-24 17:49:30

标签: perl hash

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

/**
* @ORM\Entity
* @ORM\Table(name="equips")
*/

class Equip{
    /**
    * @ORM\Column(type="string",length=30)      
    * @ORM\Id
    */
    protected $nom;

    /**
    * @ORM\Column(type="integer")
    */
    protected $punts_lliga;

    /**
    * @ORM\Column(type="integer")
    */
    protected $num_jugadors;

    /**
    * @ORM\OneToOne(targetEntity="Estadi",inversedBy="nom")
    * @ORM\JoinColumn(name="nom_estadi",referencedColumnName="nom",onDelete="SET NULL")
    */
    protected $estadi;

    /**
    * @ORM\OneToOne(targetEntity="Entrenador",inversedBy="nom")
    * @ORM\JoinColumn(name="nom_entrenador",referencedColumnName="nom",onDelete="SET NULL")
    */      
    protected $entrenador;

    /**
    * @ORM\ManyToOne(targetEntity="Lliga",inversedBy="equips")
    * @ORM\JoinColumn(name="nom_lliga",referencedColumnName="nom",onDelete="SET NULL")
    */
    protected $lliga;

    /**
    * @ORM\OneToMany(targetEntity="Jugador",mappedBy="nom_equip")
    */
    protected $jugadors;

    public function __construct(){
        $this->jugadors = new ArrayCollection();
    }
}

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

1 个答案:

答案 0 :(得分:3)

关键是要正确设置$/input record separator):

  

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

然后我们只是利用split如何将记录直接放入哈希引用:

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 = map { {split(/:\s*|\n/)} } <DATA>;

输出:

[
  { 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 },
}