Perl的保存的测量结果

问题描述:

我具有其中测量存储它看起来像这样的文本文件:Perl的保存的测量结果

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初学者。

您可以将对数组的引用存储为散列键的值。要推动它,取消对它的引用先用@{ ... }

#!/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' 
         ] 
     }; 

但是对于哈希我已经读过,您不能将多个值分配给 一键。

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

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 ] 
    ... 
); 

我建议你阅读perldata。熟悉参考资料以及如何操作它们是Perl编程的支柱之一。