哈希散列的perl(Hash of hashes perl)

2019-08-03 05:04发布

问题是,我想创建哈希散列然后加入更多的元素,以每个哈希。 我从文件中读取和IM匹配各种项目,我想将它们存储在不同的苏巴 - (“类别”,“项目”,“说明”,“分数”)。 后来,我需要将它们存储在一个CSV文件,但在此刻,我只是想打印出来,但我得到了很多错误。 这里是我的代码:

use strict;
use warnings;

my %MacroA = ('Category', 'Item', 'Description', 'Score');

open (my $file, '<', 'Layout.txt') or die $!;

while (my $line = <$file>) {

    if ($line  =~ /\b(layout)\b,/) {
        $MacroA{Category}++;
    }
    elsif ($line =~ /,([\w\s]+?),/) {
        $MacroA{Item}++;
    }

    elsif ($line =~ /,\b(\w+?.\d+?)\b,/g) {
        $MacroA{Desciption}++;
    }
    elsif ($line =~ /,\b(pass|fail)\b/) {
        $MacroA{Score}++;
    }
}

close $file;

foreach my $categories (keys %{ $MacroA{$Category}}) {
    print $categories, "\n";
}
foreach my $items (keys %{ $MacroA{$Item}}) {
    print $items, "\n";
}
foreach my $descriptions (keys %{ $MacroA{$Description}}) {
    print $descriptions, "\n";
}
foreach my $scores (keys %{ $MacroA{$Score}}) {
    print $scores, "\n";
}

和错误,我得到:

Global symbol "$Category" requires explicit package name at MacroA.pl line 29.
Global symbol "$Item" requires explicit package name at MacroA.pl line 32.
Global symbol "$Description" requires explicit package name at MacroA.pl line 35.
Global symbol "$Score" requires explicit package name at MacroA.pl line 38.
Execution of MacroA.pl aborted due to compilation errors. . .

Answer 1:

你的问题,只是代表任何编程初学者结束了挣扎过几个基本missunderstandings。 该意见是完全正确的:当这种事情发生时,读你的错误,并设法使使用一些好的教程或书籍他们的感觉。 我会帮助您一去,虽然我不太知道你想达到的目标。

你说你要创建一个,而是由你的代码是简单地创建一个计数散列,你在哪里饲养的次数每个第一级的“钥匙”的(类别,项目的跟踪的长相“的哈希散列” 。等),您正在阅读的文件中出现这不是哈希散列,因为它代表- %MacroA仅由一个此刻散列的水平。

第一个问题是,您尝试使用您要使用的密钥列表来定义您的哈希值。

my %MacroA = ('Category', 'Item', 'Description', 'Score');

什么你实际上这里做的是试图通过一个array的键。 如果你给一个散列的数组,它会解释的第一个元素为核心,第二个作为键的值,第三个为第二个键,等等。 所以,你最终会与此

%MacroA = (
    Category => Item,
    Description => Score
)

初始化哈希只是一个水平按键,你可以给每个键的0初始计:

my %MacroA = ('Category', 0, 'Item', 0, 'Description', 0, 'Score', 0);

这通常是用箭头符号写成=>使事情变得更加清晰

my %MacroA = ('Category' => 0, 'Item' => 0, 'Description' => 0, 'Score', 0);

为了intialise的哈希值,你可以做这个键的第二级(如你在正确的意见建议)

my %MacroA = ('Category' => {}, 'Item' => {}, 'Description' => {}, 'Score', {});

事实上,你甚至都不需要初始化你的哈希与空值的键因为Perl将自动激活使用初始化一个空键当您第一次使用它。 所以,你真正需要做的就是初始化像这样的散列变量

my %MacroA;

我会在这里采取的猜测和假设你的意思是有类别,描述等,你的钥匙的第一级,然后不管你在你的文件密钥的第二层发现。 我想你要算发生键的第二级的次数。

此刻,你的哈希值跟踪的类别,项...键,因为你增加存贮与这些键的值:

$MacroA{Category}++;

因为你的正则表达式匹配将返回无论他们相映成标量变量$1 ,你可以用它来增加像这样散列的第二个层次:

$MacroA{Category}->{$1}++;

最后,打印出你的计数时,您可以使用变量引用您的钥匙串的简单的错误:

$MacroA{$Category}

在那里你可能是指使用字符串每个第一级密钥:

$MacroA{'Category'};

Perl的认为你正在尝试使用一个未定义的变量,名为$Category ,因此抛出你所得到的错误。

最后,它一定会帮助你的理解,如果你打印Dumper在你的代码中的某些点的数据结构的格式的日志。 只需使用代码

use Data::Dumper;
print Dumper(\%MacroA);

在你的脚本中的任何点观看的结构%MacroA在那个时间点。

希望这有助于你奋斗吧!



文章来源: Hash of hashes perl