in reply to Re: Re: Random but non-repeating array loop
in thread Random but non-repeating array loop

Except that returns false BEFORE @chars is actually empty.
One element short.
You should use:
while (($ch = splice(@chars, rand(@chars), 1))) { print "$ch"; }
Or wherever you want to place the parentheses.

Replies are listed 'Best First'.
Re4: Random but non-repeating array loop
by blakem (Monsignor) on Jan 19, 2002 at 03:44 UTC
    Doh! you're absolutely right that my suggestion bails out one element too soon.... However, I don't think your fix changes anything. We need to write the expression so that '0' is TURE but undef and the empty list are FALSE. All of these Deparse the same for me, and all are FALSE-on-0, not TRUE-on-0 as we would like:
    # FALSE-on-0 (bad) % perl -e 'while($x = 0) {sleep print "Hello\n"}' % perl -e 'while(($x = 0)) {sleep print "Hello\n"}' % perl -e 'while((($x = 0))) {sleep print "Hello\n"}' % perl -e 'while(((($x = 0)))) {sleep print "Hello\n"}'
    So, your suggestion of adding those parens around the whole while expression doesn't seem to modify context at all. However, YuckFoo's suggestion will work just fine:
    # TRUE-on-0 (good) % perl -e 'while(($x) = 0 ) {sleep print "Hello\n"}' # but FALSE-on-() (good) % perl -e 'while(($x) = () ) {sleep print "Hello\n"}'
    Which is exactly what we want.

    -Blake