in reply to Using <> in the presence of @ARGV

@ARGV has nothing at all to do with <STDIN>. One is an array of command line arguements. One is an input stream.

If your old program was reading from <>, and you were sending it information through STDIN, than you were employing bad practice, as you should have been reading from <STDIN>, and not <> (the diamdond opperator.)

Now if you want the arguement to be a random line in dict, than one easy way to go about this is to record the ammount of lines, and read from the file and skip until $. = the random number between 1..LAST_LINE. Because code size is an issue that solution is probably the best for you.


Evan Carroll
www.EvanCarroll.com

Replies are listed 'Best First'.
Re^2: Using <> in the presence of @ARGV
by blokhead (Monsignor) on Oct 04, 2005 at 02:00 UTC
    Now if you want the arguement to be a random line in dict, than one easy way to go about this is to record the ammount of lines, and read from the file and skip until $. = the random number between 1..LAST_LINE. Because code size is an issue that solution is probably the best for you.
    Actually, a slightly more efficient solution is the following gem, slightly adapted from perlfaq5:
    open my $fh, "somefile" or die $!; my $line; rand($.) < 1 && ($line = $_) while <$fh>;
    This sets $line to a uniform, random line from "somefile" and it has the advantage of only reading through the file once. For that reason (and the fact that the important stuff can be reduced to a one-liner), it's probably more concise than the naïve solution!

    blokhead

      If you need to pick more than one word during a run of this script, then a solution based on Tie::File would probably be better.

      use Tie::File; tie my @word, 'Tie::File', '/usr/dict/words' or die $!; print "$word[rand @word]\n" for 1..10;

      -sauoq
      "My two cents aren't worth a dime.";
      
      If memmory isn't an issue, my dict file is only 880kb:
      my @file = <$fh>; print $file[int rand $#file];


      Evan Carroll
      www.EvanCarroll.com