Your code, for the most part, seems to do what you want. I don't see how you can end up in a loop. The only portion that seems very suspect is this:
if ($SIRtrue && !($_ =~ /SPECint_base/)){
$SIR{$_}=$_;
}
if ($SFRtrue && !($_ =~ /SPECfp_base/)){
$SFR{$_}=$_;
}
You're stuffing the line you find into a hash key named the same as the line value. This is likely not what you want.
This may be closer to what you want (assuming my data below somewhat resembles your file), but it's honestly hard to say:
use strict;
use warnings;
use Data::Dumper;
my $str = <<END;
SPECint_base
1
2
3
SPECfp_base
4
5
6
END
open my $fh, '<', \$str or die "Could not open for read:$!\n";
my $SIRtrue;
my $SFRtrue;
my %SIR = ();
my %SFR = ();
while (<$fh>){
chomp;
if (/SPECint_base/){
$SIRtrue = 1;
$SFRtrue = 0;
next;
}
elsif (/SPECfp_base/){
$SIRtrue = 0;
$SFRtrue = 1;
next;
}
if ($SIRtrue)){
push( @{$SIR{SPECint_base}}, $_ );
}
elsif ($SFRtrue){
push( @{$SFR{SPECfp_base}}, $_ );
}
}
print Dumper(\%SIR);
print Dumper(\%SFR);
Output:
$VAR1 = {
'SPECint_base' => [
'1',
'2',
'3'
]
};
$VAR1 = {
'SPECfp_base' => [
'4',
'5',
'6'
]
};
-
Are you posting in the right place? Check out Where do I post X? to know for sure.
-
Posts may use any of the Perl Monks Approved HTML tags. Currently these include the following:
<code> <a> <b> <big>
<blockquote> <br /> <dd>
<dl> <dt> <em> <font>
<h1> <h2> <h3> <h4>
<h5> <h6> <hr /> <i>
<li> <nbsp> <ol> <p>
<small> <strike> <strong>
<sub> <sup> <table>
<td> <th> <tr> <tt>
<u> <ul>
-
Snippets of code should be wrapped in
<code> tags not
<pre> tags. In fact, <pre>
tags should generally be avoided. If they must
be used, extreme care should be
taken to ensure that their contents do not
have long lines (<70 chars), in order to prevent
horizontal scrolling (and possible janitor
intervention).
-
Want more info? How to link or
or How to display code and escape characters
are good places to start.