下面是一个完整的程序分割成不同的块。要运行它,将答案复制并粘贴到名为populate
的文件中,但删除评论部分,如本段落。
几乎所有的Perl程序(尤其是当你还是个新手)应先从
#! /usr/bin/env perl
use strict;
use warnings;
第一行告诉系统如何执行你的程序。启用strict
和warnings
实用程序将帮助您避免常见错误,并帮助解释您的程序在出现令人惊讶的行为的情况下正在执行的操作。
根据你的问题,你想要的数据结构是散列数组。每个所述阵列的“行”或元件将对应于所述输入文件中的一行,并且将具有形式
# { Category => '...', Item => '...', Description => '...', Score => '...' }
方案还将从输入读出的列名。
该代码使用Perl的“钻石算子”来读取每一行输入。 chomp
删除尾随的换行符(如果存在)。
如果行告诉我们的头名(即,它#
开始),我们每个字段存储在@columns
。 ucfirst
位可能不熟悉:它u pper c ases 第一个字符串的字符。由于有多个列名,因此我们使用map
将ucfirst
应用于每个列名。
否则,该行代表一个数据行。我们将split
的行填入由逗号分隔的字段中,并将它们加载到新的散列中。 push
行在@MacroA
的末尾添加了一个引用(在散列之前使用反斜杠创建)。
my @MacroA;
my @columns;
while (<>) {
chomp;
if (s/^#//) { #/fix Stack Overflow coloring
@columns = map ucfirst, split /\s*,\s*/; #/ditto
}
else {
my %row;
@row{@columns} = split /,/;
push @MacroA, \%row;
}
}
请注意,上面的拆分是na&iumlaut; ve。要处理常规CSV输入,请使用CSV modules on CPAN之一。
Data::Dumper模块可用于快速打印复杂数据结构的内容。把它放在你的调试工具包里。
use Data::Dumper;
$Data::Dumper::Indent = $Data::Dumper::Terse = 1;
print Dumper \@MacroA;
__END__
下面给出
#category, item, description, score
layout,f.4,Macro placement clearance,pass
layout,f.14,No area congestion,pass
layout,f.17,placement collar diode,fail
layout,f.18,placement collar buffer,pass
layout,f.26,tie connection,fail
layout,f.28,CTS allowed cell,fail
layout,f.29,CTS allowed layed,pass
layout,f.31,Clock De-cap cell,fail
layout,f.33,Clock non default rule,fail
文件input
与内容的样品运行如下。
$ perl populate input
[
{
'Score' => 'pass',
'Item' => 'f.4',
'Description' => 'Macro placement clearance',
'Category' => 'layout'
},
{
'Score' => 'pass',
'Item' => 'f.14',
'Description' => 'No area congestion',
'Category' => 'layout'
},
{
'Score' => 'fail',
'Item' => 'f.17',
'Description' => 'placement collar diode',
'Category' => 'layout'
},
{
'Score' => 'pass',
'Item' => 'f.18',
'Description' => 'placement collar buffer',
'Category' => 'layout'
},
{
'Score' => 'fail',
'Item' => 'f.26',
'Description' => 'tie connection',
'Category' => 'layout'
},
{
'Score' => 'fail',
'Item' => 'f.28',
'Description' => 'CTS allowed cell',
'Category' => 'layout'
},
{
'Score' => 'pass',
'Item' => 'f.29',
'Description' => 'CTS allowed layed',
'Category' => 'layout'
},
{
'Score' => 'fail',
'Item' => 'f.31',
'Description' => 'Clock De-cap cell',
'Category' => 'layout'
},
{
'Score' => 'fail',
'Item' => 'f.33',
'Description' => 'Clock non default rule',
'Category' => 'layout'
}
]
满足包含'layout'的行后,%MacroA的期望值是多少? – choroba
%MacroA ='Category'=>'layout'@choroba –
您的问题包含的示例代码与http://stackoverflow.com/questions/13566521/hash-of-hashes-perl中的代码非常相似。我不知道你是否是TheBlackCorsair的用户,或者你恰好在同一个班级,但该帖子中的问题和答案可以帮助你。 – MattLBeck