2012-11-26 238 views
0

问题是,我正在尝试创建散列哈希,然后向每个哈希添加更多元素。我正在阅读一个文件,并且即时匹配各种项目,我想将它们存储在不同的子哈希中 - ('类别','项目','描述','分数')。后来我需要将它们存储在一个CSV文件中,但目前我只是试图打印它们,但是我收到了很多错误。 这里是我的代码:散列哈希perl

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. . . 
+2

发布您的错误。更好的是,阅读你的错误。 – Dancrumb

+2

我建议选择“Learning Perl”一书,并确保您了解基础知识。脚本有很多问题,包括Perl语法和逻辑。 – gpojd

+0

是的,我一直在看书@gpojd,谢谢 – TheBlackCorsair

回答

7

你的问题,只是代表任何编程初学者结束了挣扎过几个基本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不确定的变量,那么抛出你所得到的错误。

最后,如果您在代码中的某些位置打印了数据结构的格式化日志,它肯定有助于您的理解。只需使用代码

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

在脚本中的任何点在那个时间点,以查看%MacroA结构。

希望这可以帮助你奋斗!

+0

非常感谢@kikumbob。我在理解哈希结构时遇到了问题,但现在我得到了一些结果。并使用Data :: Dumper;帮助很多:) – TheBlackCorsair