in reply to Re: Using <> in the presence of @ARGV
in thread Using <> in the presence of @ARGV

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

Replies are listed 'Best First'.
Re^3: Using <> in the presence of @ARGV
by sauoq (Abbot) on Oct 04, 2005 at 05:53 UTC

    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.";
    
Re^3: Using <> in the presence of @ARGV
by EvanCarroll (Chaplain) on Oct 04, 2005 at 02:07 UTC
    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