【问题标题】:Perl - Hash reference structure of variable depthPerl - 可变深度的哈希参考结构
【发布时间】:2013-04-16 14:38:35
【问题描述】:

我有一个问题希望有人能提供帮助。

我有一个制表符分隔的文本文件,名为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 中指定年龄,您如何处理?
  • 如果这个数据结构是可变深度的,你如何正确地制作它,然后正确地访问它?

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

非常感谢您的帮助,谢谢

【问题讨论】:

  • 年龄都在同一深度,但有时它们是空的。
  • @Barmar - 所以这些可以为空,最佳实践是什么?
  • 对于您的数据,这似乎是最佳做法,因为您的键中有重要数据。如果您不存储空值,则会丢失名称。如何处理这些空值取决于应用程序的其余部分在做什么。

标签: perl loops hash data-dumper hashref


【解决方案1】:

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

它是一个值,键在哈希数据结构中必须是唯一的。

你的做法是对的!

否则,最好留空。

即:

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

【讨论】:

    【解决方案2】:

    您可以替换这行示例代码

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

    用这个:

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

    但是现在你会从你的最终数据结构中丢失没有年龄的记录,我不知道你的任务是否可以。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-10-26
      • 2011-03-16
      • 1970-01-01
      • 2021-05-09
      • 2017-11-24
      • 2018-12-07
      • 2014-05-06
      相关资源
      最近更新 更多