Jay Savage wrote: > On 3/3/07, John W. Krahn <[EMAIL PROTECTED]> wrote: >> Jay Savage wrote: >> > On 3/2/07, Robert Boone <[EMAIL PROTECTED]> wrote: >> >> I think this is all you do: >> >> >> >> $piid = (split(/\t/, $row))[0]; >> > >> > Split also takes an optional limit that keeps it from splitting the >> > string into more than n parts. This keeps spilt from performing >> > useless operations when you only want the first n-1 items, or when you >> > want to lump all the items >= n into a single lump: >> > >> > $piid = (split(/\t/,$row,2)[0]; >> > >> > Most of the time it probably doesn't matter, but adding a limit will >> > be markedly more efficient if $row is particularly long or you are >> > looping through an extremely long list of rows. >> > >> > As always, see perldoc -f split for the details. >> >> perldoc -f split >> >> [ snip ] >> >> The LIMIT parameter can be used to split a line partially >> >> ($login, $passwd, $remainder) = split(/:/, $_, 3); >> >> When assigning to a list, if LIMIT is omitted, or zero, Perl >> supplies a LIMIT one larger than the number of variables in >> the list, to avoid unnecessary work. For the list above >> LIMIT would have been 4 by default. In time critical >> applications it behooves you not to split into more fields >> than you really need. >> >> >> The limit is supplied automagically if the size of the list is know at >> compile time like in your example above so using the limit argument is >> superfluous. > > I read the doc to say that, given a list of size n, perl will perform > n + 1 splits by default. limit has diminishing returns as n increases, > but for a list of length one, not supplying a limit means double the > work, since (n + 1) = 2n when n is 1. > > Furthermore, it's not clear to me what the default limit is in the > case of a slice. Consider > > $piid = (split(/\t/,$row)[-1]; > $piid = (split(/\t/,$row)[4]; > > It seems to me that in the case of a slice, split must split the > entire string, and then return the appropriate element. Wanting a > single element and wanting the first element are two differnt things. > > Maybe the compiler optimizes for the case of a slice with index [0]? > > It may, but it's not obvious to me from the docs that it does.
Yes, it appears that a list slice does not invoke the optimization: $ perl -MO=Concise,-terse -e' ($x,$y) = split /:/, q[one:two:three:four:five:six:seven:eight] ' LISTOP (0x818a978) leave [1] OP (0x818b0c8) enter COP (0x8170958) nextstate BINOP (0x818aa10) aassign [4] UNOP (0x818aa78) null [141] OP (0x824e340) pushmark LISTOP (0x818ab80) split [3] PMOP (0x827fca8) pushre SVOP (0x818a9c0) const [5] PV (0x81877b8) "one:two:three:four:five:six:seven:eight" SVOP (0x818a240) const [6] IV (0x816cd04) 3 UNOP (0x818ace0) null [141] OP (0x8170900) pushmark UNOP (0x818ac88) null [15] PADOP (0x818abb8) gvsv GV (0x8187794) *x UNOP (0x81708a8) null [15] PADOP (0x818a9f0) gvsv GV (0x8187710) *y -e syntax OK $ perl -MO=Concise,-terse -e' ($x,$y) = ( split /:/, q[one:two:three:four:five:six:seven:eight] )[0,1] ' LISTOP (0x818c4b8) leave [1] OP (0x824e038) enter COP (0x8170958) nextstate BINOP (0x8170860) aassign [4] UNOP (0x818a988) null [141] OP (0x824e058) pushmark BINOP (0x818aa20) lslice UNOP (0x818ab90) null [141] OP (0x824d688) pushmark SVOP (0x824e358) const [5] IV (0x8187798) 0 SVOP (0x818b0d8) const [6] IV (0x816cce0) 1 UNOP (0x818aa88) null [141] OP (0x824e078) pushmark LISTOP (0x8205c78) split [3] PMOP (0x8170818) pushre SVOP (0x818a9d0) const [7] PV (0x81877c8) "one:two:three:four:five:six:seven:eight" SVOP (0x818a250) const [8] IV (0x8187738) 0 UNOP (0x818acf0) null [141] OP (0x8170900) pushmark UNOP (0x818ac98) null [15] PADOP (0x818abc8) gvsv GV (0x81877a4) *x UNOP (0x81708a8) null [15] PADOP (0x818aa00) gvsv GV (0x8187720) *y -e syntax OK You will notice that the third argument to split using the list slice is 0. John -- Perl isn't a toolbox, but a small machine shop where you can special-order certain sorts of tools at low cost and in short order. -- Larry Wall -- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED] http://learn.perl.org/