Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]


Groups > comp.lang.perl.misc > #8833

No more than N element of an array

From tmcd@panix.com (Tim McDaniel)
Newsgroups comp.lang.perl.misc
Subject No more than N element of an array
Date 2013-07-25 15:29 +0000
Organization Tim McDaniel's at Panix
Message-ID <ksrg9b$gv9$1@reader1.panix.com> (permalink)

Show all headers | View raw


A cow-orker is coding something: he gets an array of results, but
wants to take no more than the first 1000 elements.  His suggestion was

@results = @results[0 .. (MAXSEARCHRESULTS - 1, $#results)[MAXSEARCHRESULTS - 1 > $#results ]];

He felt it was "awesome".  I thought it was way too cute.

Of course there's
@results = @results[0 .. (MAXSEARCHRESULTS - 1 > $#results ? $#results : MAXSEARCHRESULTS - 1)];
It has the same number of uses of variables, just in a different order.

I considered plain @results[0 .. MAXSEARCHRESULTS].  It works if the
array is longer than the limit, but pads with undef if shorter:

$ perl -e 'use strict; use warnings; my @a = (0, 1, 2, 3, 4, 5, 6); @a = @a[0..10]; print join(",", @a), "\n"'
Use of uninitialized value $a[7] in join or string at -e line 1.
Use of uninitialized value $a[8] in join or string at -e line 1.
Use of uninitialized value $a[9] in join or string at -e line 1.
Use of uninitialized value $a[10] in join or string at -e line 1.
0,1,2,3,4,5,6,,,,

I thought of splice.

$ perl -e 'use strict; use warnings; my @a = (0, 1, 2, 3, 4, 5, 6); splice @a, 3; print join(",", @a), "\n"'
0,1,2
$ perl -e 'use strict; use warnings; my @a = (0, 1, 2, 3, 4, 5, 6); splice @a, 10; print join(",", @a), "\n"'
splice() offset past end of array at -e line 1.
0,1,2,3,4,5,6
$ perl -e 'print $], "\n"'
5.014002

But that's on my ISP.  On our office machines, no warning.

$  perl -e 'use strict; use warnings; my @a = (0, 1, 2, 3, 4, 5, 6); splice @a, 3; print join(",", @a), "\n"'
0,1,2
$  perl -e 'use strict; use warnings; my @a = (0, 1, 2, 3, 4, 5, 6); splice @a, 10; print join(",", @a), "\n"'
0,1,2,3,4,5,6
$  perl -e 'print $], "\n"'
5.016002
$ perlfunc splice | cat
...
If OFFSET is past the end of the array,
Perl issues a warning, and splices at the end of the array.
...

So is splice likely to ever output such a warning again, so the 5.16
documentation is simply outdated?  Or was that just an error in 5.16
and the warning now comes out in 5.18?

To protect against that,
splice @results, MAXSEARCHRESULTS if @results > MAXSEARCHRESULTS;
Doable (warning: that's untested code).  But it's not as pretty.

Is there a cleaner way?

(As it happens, he now has to check the limit in an if anyway for
another purpose, so he knows that @results[0 .. MAXSEARCHRESULTS - 1]
won't go past the end, so the question is now moot.  I'm still
curious.)

-- 
Tim McDaniel, tmcd@panix.com

Back to comp.lang.perl.misc | Previous | NextNext in thread | Find similar


Thread

No more than N element of an array tmcd@panix.com (Tim McDaniel) - 2013-07-25 15:29 +0000
  Re: No more than N element of an array Rainer Weikusat <rweikusat@mssgmbh.com> - 2013-07-25 16:38 +0100
    Re: No more than N element of an array Rainer Weikusat <rweikusat@mssgmbh.com> - 2013-07-25 16:44 +0100
  Re: No more than N element of an array Ben Morrow <ben@morrow.me.uk> - 2013-07-26 05:12 +0100
    Re: No more than N element of an array Charles DeRykus <derykus@gmail.com> - 2013-07-25 23:08 -0700
      Re: No more than N element of an array Ben Morrow <ben@morrow.me.uk> - 2013-07-26 09:00 +0100
        Re: No more than N element of an array Charles DeRykus <derykus@gmail.com> - 2013-07-26 02:19 -0700
          Re: No more than N element of an array "Peter J. Holzer" <hjp-usenet3@hjp.at> - 2013-07-26 11:32 +0200
            Re: No more than N element of an array Charles DeRykus <derykus@gmail.com> - 2013-07-26 03:38 -0700
          Re: No more than N element of an array Ben Morrow <ben@morrow.me.uk> - 2013-07-26 11:26 +0100
          Re: No more than N element of an array tmcd@panix.com (Tim McDaniel) - 2013-07-26 14:27 +0000
            min (), and Perl modules Ivan Shmakov <oneingray@gmail.com> - 2013-07-26 15:16 +0000
              Re: min (), and Perl modules tmcd@panix.com (Tim McDaniel) - 2013-07-26 16:17 +0000
            Re: No more than N element of an array Ben Morrow <ben@morrow.me.uk> - 2013-07-26 16:39 +0100
        Re: No more than N element of an array Rainer Weikusat <rweikusat@mssgmbh.com> - 2013-07-26 16:38 +0100
          Re: No more than N element of an array Ben Morrow <ben@morrow.me.uk> - 2013-07-26 19:23 +0100
            Re: No more than N element of an array Rainer Weikusat <rweikusat@mssgmbh.com> - 2013-07-30 17:52 +0100
              Re: No more than N element of an array Charles DeRykus <derykus@gmail.com> - 2013-07-30 22:10 -0700

csiph-web