The simplest change is to wrap what you have in another while loop that reads the datafile in paragraph mode, and then open each multi-line dataset as an in-memory file.
That way your existing code can operate directly on that ramfile without change:
#!/usr/bin/perl use warnings; use strict; use 5.010; $/ = ''; ## paragraph mode while( my $dataset = <DATA> ) { ## open each dataset as a ramfile open DATASET, '<', \$dataset or die $!; local $/ = "\n"; ## Return readline to by-line mode my $counter = 0; my $total_aligned_reads = 0; my $mtDNA; while (<DATASET>) { ## my $line = $_; #### Unnecessary; see next comment next if /Data_Set_\d+: /; next if /^NoCoordinateCount/; next if /^$/; my($chr, $lenLabel, $lengNumbers, $AlignedLabel, $alignedNumbe +rs) = split /\s/; ####, $line; split operates on $_ by default $total_aligned_reads += $alignedNumbers; $mtDNA = $alignedNumbers if $chr eq "chrM"; } say "total aligned reads = $total_aligned_reads"; say "mtDNA = $mtDNA"; say "mtDNA percentage = ", $mtDNA/$total_aligned_reads*100; } __DATA__ ...sample data as above ...
Produces:
C:\test>junk total aligned reads = 14253 mtDNA = 2650 mtDNA percentage = 18.5925770013331 total aligned reads = 906 mtDNA = 1 mtDNA percentage = 0.11037527593819 total aligned reads = 538773 mtDNA = 169 mtDNA percentage = 0.0313675703867863
In reply to Re: How to loop over multiple datasets (blocks of text)?
by BrowserUk
in thread How to loop over multiple datasets (blocks of text)?
by rnaeye
| For: | Use: | ||
| & | & | ||
| < | < | ||
| > | > | ||
| [ | [ | ||
| ] | ] |