Perl - 变量深度的哈希参考结构

时间:2013-04-23 11:37:11

标签: perl loops hash data-dumper hashref

我有一个问题,我希望有人可以提供帮助。

我有一个名为FILE.txt的制表符分隔文本文件:

(注意缺少两个年龄段):

BOY    Fred      Smith     56
BOY    David     Jones     18
GIRL   Anne      Roberts   
BOY    Fred      Andrews
GIRL   Hannah    Williams  27

我想将文本文件读入哈希/哈希引用数据结构(如下所示):

open my $f, '<', 'FILE.txt';
my $details;
while (<$f>) {
    chomp;
    my ( $gender, $firstName, $middleName, $lastName, $age) = split("\t");
    $details->{$gender}->{$firstName}->{$lastName} = "$age";
}
  • 这是制作结构的正确方法吗,因为有时文本文件中可能没有年龄?

使用这个哈希/哈希引用结构我想打印人员的详细信息,但因为有些人没有年龄。这会导致散列值和单位化值中出现空值等问题。

以下是它产生的数据:

{
  BOY  => { David => { Jones => 18 }, Fred => { Andrews => "", Smith => 56 } },
  GIRL => { Anne => { Roberts => "" }, Hannah => { Williams => 27 } },
}
  • 如何处理此人未在FILE.txt中指定年龄的情况?
  • 如果数据结构具有可变深度,然后正确访问它,您如何正确地构建此数据结构?

我知道如果它具有固定/已知深度,如何制作和访问散列/散列引用的不同部分,但是当数据结构可能具有不同深度时,最好的方法是什么?

非常感谢您的帮助,谢谢

2 个答案:

答案 0 :(得分:1)

存储空白年龄值时应该没有问题!

这是一个值,密钥必须在哈希数据结构中是唯一的。

你做的方式是对的!

否则,如果你把它变成空白会更好。

即:

my ( $gender, $firstName, $middleName, $lastName, $age) = split("\t") ;
if($age =~ /\d+/) {
   $details->{$gender}->{$firstName}->{$lastName} = "$age"; 
} else {
   $details->{$gender}->{$firstName}->{$lastName} = ""; 
}

答案 1 :(得分:0)

您可以替换示例代码的这一行

$details->{$gender}->{$firstName}->{$lastName} = "$age";

这一个:

$details->{$gender}->{$firstName}->{$lastName} = "$age" if $age;

但是现在你将错过最终数据结构中没有年龄的记录,我不知道你的任务是否合适。

同样在您的代码中,您的年龄值包含在字符串中:"$age",所以当存在时 没有年龄你得到空字符串值,这本身表明该记录没有年龄。