in reply to efficiently printing to 30 files

Is there any reason that you want to print as soon as you see someone's name? Why not instead just push to a hash of arrays, then dump the information out at the end? That way you won't have 30 file handles open at once (that used to be limited to 20 handles for C programs but Perl no doubt handles that nicely).

foreach my $n (keys %emp) { push(@{$data{'A'}},$emp{$n}{'Emp'}) if $emp{$n}{'Org'}=~/ABC/; push(@{$data{'B'}},$emp{$n}{'Emp'}) if $emp{$n}{'Org'}=~/DEF/; }

You may want to initailize the hash of arrays to start with so as to avoid those ugly warnings. Afterwards you can dump the data to files one by one.

foreach(keys %data){ open(DATA,">group$_.txt")||die"Couldn't open file for $_:$!"; print DATA join("\n",@{$Data{$_}}); close(DATA); }
--t. alex
Life is short: get busy!

Replies are listed 'Best First'.
Re: Re: efficiently printing to 30 files
by larsen (Parson) on Mar 06, 2003 at 22:23 UTC
    Maybe this idiom could save some keystrokes and improve readability. I still don't like the repetitions of $emp{ $_ ...: ideas?
    push @{ $emp{ $_ }{ 'Org' } =~ /ABC/ ? $data{ A } : $emp{ $_ }{ 'Org' } =~ /DEF/ ? $data{ B } : [] }, $emp{ $_ }{ 'Emp' } for keys %emp;

      Your approach is workable, but I really wouldn't want to commit myself without having a much better idea of what problem we're trying to solve. In any case, I prefer to use the ternary operator '?' for single cases or occasionally double cases. Beyond that is getting a little bit too clever (but don't take that personally).

      I have a feeling that either a series of if statements or a loop would solve this particular problem, but if there's a way to find out which values are more likely to occur, I would want to test for those values first.

      All this arm-waving is good fun, but as I said, without having a good understanding of what the original poster's problem is, we can't offer a totally effective solution.

      --t. alex
      Life is short: get busy!
        In any case, I prefer to use the ternary operator '?' for single cases or occasionally double cases. Beyond that is getting a little bit too clever (but don't take that personally).

        No, I don't take it personally. Actually, I take it as an advice about maintaing a good balance between cleverness and readability. Which is always a good advice.

        First of all, since you used the word "clever", I should confess that I stole that idiom from TheDamian :)
        Here it's where I've seen it the first time.

        Maybe I shouldn't call it "idiom", since it's not, AFAIK, commonly used by Perl programmers. I'm just wondering if it's worth to be diffused, like the Schwartzian Transform, which is difficult at first sight, but once you grocked it, it's useful in many situations and, when it's correctly applied, improves performance and, IMO, readability (I mean: a well trained programmer should be able to recognize the code pattern, abstract from details and just look at what is going to be ordered, and how it's going to be ordered: things that are well separated in ST)