The*_*air 0 perl hash reference
问题是我正在尝试创建哈希散列,然后向每个哈希添加更多元素.我正在阅读一个文件,我正在匹配各种项目,我想将它们存储在不同的子网站中 - ('类别','项目','描述','得分').稍后我需要将它们存储在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";
}
Run Code Online (Sandbox Code Playgroud)
和我得到的错误:
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. . .
Run Code Online (Sandbox Code Playgroud)
你的问题只是代表了一些基本的误解,任何编程初学者最终都会陷入困境.评论是完全正确的:当发生这种事情时,请阅读您的错误并尝试使用一些好的教程或书籍来理解它们.我会帮助你,虽然我不太清楚你想要达到的目标.
你说你想要创建一个"哈希散列",但是根据代码的外观,你只需要创建一个计数哈希,你可以跟踪每个第一级"键"的次数(类别,项目,在你正在阅读的文件中发生.这不是哈希的哈希值 - %MacroA它只包含一个级别的哈希值.
第一个问题是您尝试使用要使用的键列表来定义哈希.
my %MacroA = ('Category', 'Item', 'Description', 'Score');
Run Code Online (Sandbox Code Playgroud)
你在这里做的是试图传递array你的钥匙.如果给哈希一个数组,它会将第一个元素解释为其键,第二个元素将其解释为该键的值,第三个元素作为第二个键,依此类推.所以你最终会得到这个
%MacroA = (
Category => Item,
Description => Score
)
Run Code Online (Sandbox Code Playgroud)
要仅为一个级别的键初始化哈希,您可以为每个键初始计数为0:
my %MacroA = ('Category', 0, 'Item', 0, 'Description', 0, 'Score', 0);
Run Code Online (Sandbox Code Playgroud)
这通常用箭头符号书写,=>以使事情更清晰
my %MacroA = ('Category' => 0, 'Item' => 0, 'Description' => 0, 'Score', 0);
Run Code Online (Sandbox Code Playgroud)
要初始化第二级键的哈希,你可以这样做(正如你在评论中正确建议的那样)
my %MacroA = ('Category' => {}, 'Item' => {}, 'Description' => {}, 'Score', {});
Run Code Online (Sandbox Code Playgroud)
实际上,您甚至不需要将哈希值初始化为具有空值的键,因为perl将在您第一次使用它时使用自动生成来初始化空键.所以你真正要做的就是初始化哈希变量
my %MacroA;
Run Code Online (Sandbox Code Playgroud)
我会在这里猜一下,并假设您打算将类别,描述等作为第一级别的键,然后将您在文件中找到的任何内容作为第二级键.我想你想要计算第二级密钥出现的次数.
目前,您的哈希跟踪Category,Item ...键,因为您正在递增使用这些键存储的值:
$MacroA{Category}++;
Run Code Online (Sandbox Code Playgroud)
因为你的正则表达式匹配会将它们匹配的任何内容返回到标量变量中$1,你可以使用它来增加第二级哈希值,如下所示:
$MacroA{Category}->{$1}++;
Run Code Online (Sandbox Code Playgroud)
最后,当打印出你的计数时,你犯了一个简单的错误:用变量引用你的键字符串:
$MacroA{$Category}
Run Code Online (Sandbox Code Playgroud)
您可能想要为每个第一级键使用字符串:
$MacroA{'Category'};
Run Code Online (Sandbox Code Playgroud)
Perl认为你正在尝试使用一个未定义的变量$Category,因此会抛出你得到的错误.
最后,如果您Dumper在代码中的某些位置打印数据结构的格式化日志,它肯定有助于您理解.只需使用代码
use Data::Dumper;
print Dumper(\%MacroA);
Run Code Online (Sandbox Code Playgroud)
在脚本中的任何位置查看该%MacroA时间点的结构.
希望这有助于你挣扎!