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 $
-- Ken
In reply to Re: Write to multiple files
by kcott
in thread Write to multiple files
by julio_514
| For: | Use: | ||
| & | & | ||
| < | < | ||
| > | > | ||
| [ | [ | ||
| ] | ] |