以下是一个完整的程序,分成不同的块。要运行它,请将答案复制并粘贴到名为
populate
的文件中,但删除此段落等注释部分。
几乎所有的Perl程序(特别是当你还是初学者时)都应该以此开始。
use strict;
use warnings;
第一行告诉系统如何执行您的程序。启用
strict
和
warnings
pragma将有助于避免常见错误,并在您看到意外行为的情况下帮助解释程序正在做什么。
根据您的问题,您想要的数据结构是哈希数组。数组的每个“行”或元素将对应输入文件中的一行,并具有以下形式。
# { Category => '...', Item => '...', Description => '...', Score => '...' }
该程序还将从输入中读取列名。
代码使用Perl的“钻石操作符”来读取每一行输入。chomp
会删除末尾的换行符(如果有的话)。
如果该行告诉我们标题名称(即以#
开头),我们将每个字段存储在@columns
中。ucfirst
可能不太熟悉:它将字符串的第一个字符大写。因为有多个列名,我们使用map
将ucfirst
应用于每个列名。
否则,该行代表数据行。我们将该行
拆分
成由逗号分隔的字段,并将它们加载到新哈希表中。
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ïautve。对于处理一般的CSV输入,请使用CPAN上的
CSV模块之一。
Data::Dumper模块可用于快速打印复杂数据结构的内容。将其放入您的调试工具包中。
use Data::Dumper;
$Data::Dumper::Indent = $Data::Dumper::Terse = 1;
print Dumper \@MacroA;
__END__
给定一个名为input
的文件,其内容如下:
#category, item, description, score
layout,f.4,宏单元放置间隙,通过
layout,f.14,无区域拥堵,通过
layout,f.17,放置领口二极管,失败
layout,f.18,放置领口缓冲器,通过
layout,f.26,接地连接,失败
layout,f.28,允许CTS单元,失败
layout,f.29,允许CTS层,通过
layout,f.31,时钟去耦电容单元,失败
layout,f.33,时钟非默认规则,失败
以下是一个示例运行。
$ perl populate input
[
{
'Score' => '通过',
'Item' => 'f.4',
'Description' => '宏单元放置间隙',
'Category' => '布局'
},
{
'Score' => '通过',
'Item' => 'f.14',
'Description' => '无区域拥塞',
'Category' => '布局'
},
{
'Score' => '失败',
'Item' => 'f.17',
'Description' => '放置领口二极管',
'Category' => '布局'
},
{
'Score' => '通过',
'Item' => 'f.18',
'Description' => '放置领口缓冲器',
'Category' => '布局'
},
{
'Score' => '失败',
'Item' => 'f.26',
'Description' => '连接绑定',
'Category' => '布局'
},
{
'Score' => '失败',
'Item' => 'f.28',
'Description' => '允许CTS单元',
'Category' => '布局'
},
{
'Score' => '通过',
'Item' => 'f.29',
'Description' => '允许CTS层',
'Category' => '布局'
},
{
'Score' => '失败',
'Item' => 'f.31',
'Description' => '时钟去耦单元',
'Category' => '布局'
},
{
'Score' => '失败',
'Item' => 'f.33',
'Description' => '时钟非默认规则',
'Category' => '布局'
}
]