in reply to Conditionally Substituting multi-line string with single string

If your input file isn't too big, you might want to slurp-and-split:
use strict; use warnings; my @scaffolds; { local $/ = undef; open(IN,"t.txt") or die; @scaffolds = split(/(>scaffold\d+)\n/, <IN>); } close IN; my $i; my $s; foreach (@scaffolds) { if (/^>/) { $s = "$_."; # assemble label for this scaffold $i = 1; # and initialize its counter } else { print map { "$s." . $i++ . "\n" # print incremented label . $_ # and the GACT* stuff } split(/(?:N{4,}\n)+/, $_); # for each entry within the + scaffold } }

Sorry for changing all the variables on you. And one subtle detail worth noting is the parens in the first split!

Update:I changed the first split from split(/>scaffold(\d+)/, <IN>); to split(/(>scaffold\d+)\n/, <IN>);. This simplifies the assignment of $s and obviates the stripping of whitespace in map.

  • Comment on Re: Conditionally Substituting multi-line string with single string
  • Download Code