これはある種のテストプログラムだと思います。これをこのように行うと、より意味がありますか?
use strict;
use warnings;
my $feature_to_test;
my $affected_area;
while ( my $line <DATA> ) {
chomp $line;
if ( $line =~ /^Affected area\s*:/i ) {
for (;;) { #Loop forever (until I tell you to stop i.e.)
my $line = <DATA>;
if ( $line !~ /^\s*$/ ) {
$affected_area = $line;
last;
}
}
}
if ( $line =~ /^Affected area\s*:/i ) {
for (;;) { #Loop forever (until I tell you to stop i.e.)
my $line = <DATA>;
if ( $line !~ /^\s*$/ ) {
$affected_area = $line;
last;
}
}
}
if ( $line =~ /^Feature to test\s*:/i ) {
for (;;) { #Loop forever (until I tell you to stop i.e.)
my $line = <DATA>;
if ( $line !~ /^\s*$/ ) {
$feature_to_test = $line;
last;
}
}
}
}
else {
print qq("Not a special line: "$line"\n);
}
__DATA__
any text
Affected area :
menu
Feature to test :
diagnostics
この方法の利点は、一度にレコード全体を解析しようとするのではなく、行ごとにテストできることです。さらに、ファイルが読み込まれる方法をより適切にエミュレートします。
split
長いテキストを配列に分割するために使用することもできます。これは、行ごとに実行することもできます。
use strict;
use warnings;
my $string = "any text
Affected area :
menu
Feature to test :
diagnostics
";
my @string_list = split /\n/, $string; #Now, this is split line by line
for my $line ( @string_list ) {
print "same logic as above...\n";
}
これをループとして実行し、各行で読み取ると、ロジックが少しすっきりして理解しやすくなります。おそらくそれほど効率的ではありませんが、Perl で数百万行のファイルを読み取る場合でも、エコノボックス PC でも数秒しかかかりません。