Perl保存测量结果

Perl保存测量结果,perl,hash,measurement,Perl,Hash,Measurement,我有一个文本文件,其中存储了测量值,如下所示: sometext Step 1: tphlay = 1.5e-9 tplhay = 4.8e-9 tphlby = 1.01e-8 tplhby = 2.4e-10 Step 2: tphlay = 2.5e-9 tplhay = 1.8e-9 tphlby = 6.01e-8 tplhby = 1.4e-10 ... 对每个步骤进行多个测量(tphlay,…),并对不同步骤中的每个测量进行多个值。脚本应该能够将任何测量的所有值

我有一个文本文件,其中存储了测量值,如下所示:

sometext
Step 1:
tphlay  = 1.5e-9
tplhay  = 4.8e-9
tphlby  = 1.01e-8
tplhby  = 2.4e-10

Step 2:
tphlay  = 2.5e-9
tplhay  = 1.8e-9
tphlby  = 6.01e-8
tplhby  = 1.4e-10
...
对每个步骤进行多个测量(tphlay,…),并对不同步骤中的每个测量进行多个值。脚本应该能够将任何测量的所有值保存在不同的数组中,如arraytphlay=[1.5e-9,2.5e-9]等等

每个步骤的测量值都相同。 其中一个问题是度量的名称是可变的,并且取决于以前运行的脚本。但是我创建了一个数组(namearray),其中包含这些名称。 我的想法是为namearray的每个元素创建一个数组,但我读到这是一个糟糕的做法,因为它使用软引用,应该使用哈希。但是对于散列,我已经读到不能将多个值分配给一个键

因此,我想知道如何以一种智能的方式保存这些度量值,我希望您能提供一个代码示例,因为我只是perl的初学者

但是对于散列,我已经读到,您不能将多个值赋给 一把钥匙

确实如此,但这并不意味着不能将数据结构与键相关联。您可能需要的是数组引用。给你一个想法:

my @array = (1, 2, 3);
# First element of the array
$array[0]; 

# $arrayref can be thought as a pointer to an anonymous array.
# $arrayref is called a *reference*
my $arrayref = [ 1, 2, 3 ];
# First element of the anonymous array $arrayref points to. 
# The -> operator is used to dereference $arrayref, to access 
# that array.
$arrayref->[0];
请注意(这是您的问题的有趣之处)
$arrayref
是一个标量值,因此适合用作散列值。例如:

my %hash = (
  tphlay => [ 1.5e-9, 2.5e-9 ]
  ...
);

我建议你读一读。熟悉引用以及如何操作它们是Perl编程的支柱之一。

您可以将对数组的引用存储为哈希键的值。要推送到它,首先用
@{…}
取消引用它:

#!/usr/bin/perl
use warnings;
use strict;

my %measurement;

while (<>) {
    if (my ($key, $value) = /(\w+)\s*=\s*([0-9.e+\-]+)/) {
        push @{ $measurement{$key} }, $value;
    }
}

use Data::Dumper; print Dumper \%measurement;
$VAR1 = {
          'tphlay' => [
                        '1.5e-9',
                        '2.5e-9'
                      ],
          'tplhay' => [
                        '4.8e-9',
                        '1.8e-9'
                      ],
          'tphlby' => [
                        '1.01e-8',
                        '6.01e-8'
                      ],
          'tplhby' => [
                        '2.4e-10',
                        '1.4e-10'
                      ]
        };