Perl 保存测量结果
Perl save measurement results
我有一个存储测量值的文本文件,如下所示:
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 的初学者。
But for hashes i have read that you cannot assign multiple values to
one key.
确实如此,但这并不意味着您不能将数据结构与键相关联。您可能需要的是数组引用。只是给你一个想法:
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 编程的支柱之一。
您可以将对数组的引用存储为哈希键的值。要推送到它,请先使用 @{ ... }
:
取消引用它
#!/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'
]
};
我有一个存储测量值的文本文件,如下所示:
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 的初学者。
But for hashes i have read that you cannot assign multiple values to one key.
确实如此,但这并不意味着您不能将数据结构与键相关联。您可能需要的是数组引用。只是给你一个想法:
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 编程的支柱之一。
您可以将对数组的引用存储为哈希键的值。要推送到它,请先使用 @{ ... }
:
#!/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'
]
};