in reply to FILEHANDLE with $var in name (for pipe)
#!/usr/bin/perl use strict; use Symbol; my %hash; my @dirs; @dirs = qw(ONE TWO THREE FOUR); my %fh; for my $loop (@dirs) { my($from, $to) = (gensym, gensym); pipe ($from, $to) or die "Oops Pipe: $!\n"; select((select($to), $|++ )[0]); # set autoflush $|++; my $test = rand 5; # simulate processing print $to "$test $loop\n"; $fh{"FROM_CHILD_$loop"} = $from; $fh{"TO_PARENT_$loop"} = $to; } for my $loop (@dirs) { my $from = $fh{"FROM_CHILD_$loop"}; my $to = $fh{"TO_PARENT_$loop"}; chomp( my $in = <$from> ); (my $value, my $key) = split(/\ /, $in); $hash{$key} = $value; close $to; close $from; } for my $loop(keys %hash) { print "keys $loop => $hash{$loop}\n"; }
The Symbol::gensym function returns a reference to an anonymous glob which can be used just like a normal file handle.
And with recent Perls (sorry, I'm not sure how recent), you don't even need to call gensym; Perl handles it automatically, so you can just say:
my($from, $to); pipe ($from, $to) or die "Oops Pipe: $!\n"; ... $fh{"FROM_CHILD_$loop"} = $from; $fh{"TO_PARENT_$loop"} = $to;
|
|---|