ここでは、ある種の名前付き列を実行しようとしているようです。あなたがそれを行う方法を知っていれば、これはかなり簡単です。
コメントからPeterに移動すると(「[I]各行の「レイアウト」を「説明」に保存したい」)、このコードで実行できるのは、保存することです。
ハッシュについて私が目にする主なケースはレコード自体であるため、このデモンストレーションで使用するハッシュはそれだけです。それらを配列に格納します。私はあなたがあなたの例からそれらをどのように索引付けしたいかを本当に理解していません。そして、あなたはそれらをどのように処理したいかについて少し混乱しているようです。確かに、を含むすべての行を処理し
'layout'
、それを「カテゴリ」フィールドとして保存することはそれほど有用ではありません。
use strict;
use warnings;
my @columns = qw<field1 field2 field3 field4>;
my @list;
my $fh = \*::DATA;
my $header = <$fh>;
if ( substr( $header, 0, 1 ) eq '#' ) {
( $header ) = $header =~ m/#(.*)/;
$header =~ s/\s+$//;
@columns = split /,\s*/, $header;
}
else {
seek( $fh, 0, 0 ); # go back
}
# optional statement to capitalize field names
@columns = map { ucfirst } @columns;
while ( my $line = <$fh> ) {
next unless $line =~ m/^\s*layout\b/;
$line =~ s/\s*$//;
# store fields by hash slice in the tip of the array
@{ $list[@list] }{ @columns } = split /,\s*/, $line;
}
__DATA__
#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
レコードを配列にコピーすることは「処理」の単純なモデルですが、代わりに次のようなことを行うことができます。
my %by_item;
while ( my $line = <$fh> ) {
next unless $line =~ m/^\s*layout\b/;
$line =~ s/\s*$//;
my %h;
@h{ @columns } = split /,\s*/, $line;
$by_item{ $h{Item} } = \%h;
### OR
# push @{ $by_item{ $h{Item} } }, %h;
}
これを行うこともできます:
my %by_field;
...
$by_field{Item}{ $h{Item} }
= $by_field{Description}{ $h{Description} }
= \%h
;