下面是一个完整的程序,分成不同的块。要运行它,请将答案复制并粘贴到名为 的文件populate
中,但要删除本段等注释部分。
几乎所有 Perl 程序(尤其是当您还是初学者时)都应该从
#! /usr/bin/env perl
use strict;
use warnings;
第一行告诉系统如何执行你的程序。启用strict
和warnings
pragmata 将帮助您避免常见错误,并帮助解释您的程序在您看到令人惊讶的行为的情况下正在做什么。
根据您的问题,您想要的数据结构是哈希数组。数组的每个“行”或元素将对应于输入文件中的一行,并具有以下形式
# { Category => '...', Item => '...', Description => '...', Score => '...' }
该程序还将从输入中读取列名。
该代码使用 Perl 的“菱形运算符”来读取每一行输入。chomp
如果存在,则删除尾随换行符。
如果该行告诉我们标题名称(即,它以 开头#
),我们将每个字段存储在@columns
. 该ucfirst
位可能不熟悉:它是字符串的第一个字符。因为有几个列名,我们使用来应用到每一个。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;
}
}
请注意,上面的拆分是天真的。要处理一般 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,宏放置间隙,pass
布局,f.14,无区域拥堵,通过
布局,f.17,放置领二极管,失败
布局,f.18,放置领缓冲区,通过
布局,f.26,领带连接,失败
布局,f.28,CTS 允许单元格,失败
布局,f.29,CTS 允许铺设,通过
布局,f.31,时钟去电容单元,失败
布局,f.33,时钟非默认规则,失败
下面是一个示例运行。
$ perl 填充输入
[
{
'分数' => '通过',
'项目' => 'f.4',
'描述' => '宏放置间隙',
'类别' => '布局'
},
{
'分数' => '通过',
'项目' => 'f.14',
'描述' => '没有区域拥堵',
'类别' => '布局'
},
{
'得分' => '失败',
'项目' => 'f.17',
'描述' => '安置领二极管',
'类别' => '布局'
},
{
'分数' => '通过',
'项目' => 'f.18',
'描述' => '放置领缓冲区',
'类别' => '布局'
},
{
'得分' => '失败',
'项目' => 'f.26',
'描述' => '领带连接',
'类别' => '布局'
},
{
'得分' => '失败',
'项目' => 'f.28',
'描述' => 'CTS 允许的单元格',
'类别' => '布局'
},
{
'分数' => '通过',
'项目' => 'f.29',
'描述' => 'CTS 允许铺设',
'类别' => '布局'
},
{
'得分' => '失败',
'项目' => 'f.31',
'Description' => 'Clock De-cap cell',
'类别' => '布局'
},
{
'得分' => '失败',
'项目' => 'f.33',
'描述' => '时钟非默认规则',
'类别' => '布局'
}
]