perldoc -f print says this:
Note that if you’re storing FILEHANDLES in an array or other expression, you will have to use a block returning its value instead:
print { $files[$i] } "stuff\n";
print { $OK ? STDOUT : STDERR } "stuff\n";
| [reply] [d/l] [select] |
This sort of thing becomes immensely useful when you create your files "on the fly". A contrived example is in order:
use strict;
use warnings;
my %fh;
foreach (1..1000) {
my $num = int(rand() * 10000);
my $first_char = substr($num, 0, 1);
$fh{$first_char}
|| open($fh{$first_char}, ">$first_char.out") or die $!;
print {$fh{$first_char}} "$num\n";
}
| [reply] [d/l] |
Interesting timing... I was just working this out too....found the answer on google. :-) Anyways, just for kicks, here is the way I used it.... I had a few dictionary files, which I wanted to split and merge into "alphabetical files" , like a, b, c, etc so I could search for a word faster. So I need to open filehandle variables pointing to a..z.
#!/usr/bin/perl
use warnings;
use strict;
my $file = shift;
open(FH, "< $file") or die $!;
my %fh;
foreach my $let('a'..'z'){
open( $fh{$let}," >> letters/$let");
}
while(<FH>){
my $count = 0;
my $word = $_;
chomp $word;
$word = lc $word;
$word =~ s/[[:^print:]\s+]+//g; #only printable characters
#skip words with apostrophe, dashes, spaces, or a .w ending
my $word1 = $word;
$count = $word1 =~ tr/\'-_ &,.0-9//;
if($count > 0){next}
my $let = substr($word, 0, 1);
if (!defined $fh{$let}){print $word;next}
else{
print { $fh{$let} } "$word\n";}
}
__END__
and then to "uniqify the files
#!/usr/bin/perl
use warnings;
use strict;
foreach my $file('a'..'z'){
system("sort -u letters/$file > letters/$file.txt");
}
__END__
I'm not really a human, but I play one on earth.
flash japh
| [reply] [d/l] [select] |