Trying to guess which files you'll need beforehand is not a good idea.
Here's a solution that opens the files you need on demand and closes them all at the end of the script.
#!/usr/local/bin/perl
# multifileout.pl
use strict;
use warnings;
my @file_ends = qw{./ .fasta};
my %handle = ();
my @ko_array = qw(abc def ghi);
while (<DATA>) {
chomp;
my ($head, $seq) = split / /;
for my $ko (@ko_array) {
if ($head =~ m/$ko/) {
if (! exists $handle{$head}) {
open my $fh, q{>>}, join($ko, @file_ends);
$handle{$head} = $fh;
}
print { $handle{$head} } qq{$head\n$seq\n};
}
}
}
map { close $handle{$_} } keys %handle;
__DATA__
abc a123
def d123
abc a456
ghi g123
ghi g456
def d456
Here's the results:
ken@ganymede: ~/tmp
$ ls -l *.fasta
ls: *.fasta: No such file or directory
ken@ganymede: ~/tmp
$ multifileout.pl
ken@ganymede: ~/tmp
$ ls -l *.fasta
-rw-r--r-- 1 ken staff 18 7 Feb 08:29 abc.fasta
-rw-r--r-- 1 ken staff 18 7 Feb 08:29 def.fasta
-rw-r--r-- 1 ken staff 18 7 Feb 08:29 ghi.fasta
ken@ganymede: ~/tmp
$ cat abc.fasta
abc
a123
abc
a456
ken@ganymede: ~/tmp
$ cat def.fasta
def
d123
def
d456
ken@ganymede: ~/tmp
$ cat ghi.fasta
ghi
g123
ghi
g456
ken@ganymede: ~/tmp
$
|