Шаг 1: Добавьте use strict
и use warnings
. Это выдает ошибки о необъявленных переменных.
Шаг 2: Добавьте my
, чтобы объявить $rlseHistRepo
. Также добавьте my (%rlsSite, %rlsAuthor)
, чтобы объявить два хэша, используемых в вашем последнем цикле. Но это странно, так как вы читаете значения из этих хешей без всякого хранения в них данных. Это дает нам несколько ошибок «неинициализированного значения». Поэтому я думаю, что нам нужно переосмыслить вещи.
Идея состоит в том, чтобы создать один хэш для каждой записи. И когда запись заканчивается (когда мы получаем строку из тире), мы выводим эту запись. Примерно так:
my @keys = qw[Route Author Date Release Log
Status Content Comment];
my %record;
while(<IN> ) {
chomp;
if (/-----/) {
say OUTCSV join ',', @record{@keys};
%record = ();
}
# ignore lines without a ':'
next unless /:/;
# ignore the '***' lines
next if /\*\*\*/;
my ($key, $value) = split /\s*:\s*/, $_, 2);
# Some keys have their values on the next line
if ($value !~ /\S/) {
chomp($value = <IN>);
$value =~ s/^\s+//;
}
$record{$key} = $value;
}
Шаг 3: Очистите вещи, удалив несколько ненужных переменных и превратив их в фильтр Unix (чтение из STDIN
и запись в STDOUT
) - это на самом деле легче написать и делает вашу программу гораздо более гибкий.
#!/usr/bin/perl
use strict;
use warnings;
use feature 'say';
my @keys = qw[Route Author Date Release Log
Status Content Comment];
say "Site,Author,Release,Date,Version,Changes,Comment";
say ",,,,,,,";
my %record;
while (<>) {
chomp;
if (/-----/) {
say join ',', @record{@keys};
%record = ();
}
# ignore lines without a ':'
next unless /:/;
# ignore the '***' lines
next if /\*\*\*/;
if (my ($key, $value) = split /\s*:\s*/, $_, 2) {
# Some keys have their values on the next line
if ($value !~ /\S/) {
chomp($value = <>);
$value =~ s/^\s+//;
}
$record{$key} = $value;
}
}
Как уже упоминалось, в производственном коде вы захотите использовать Text :: CSV для получения выходных данных.