http://qs321.pair.com?node_id=723258


in reply to Re: how to speed lookups?
in thread how to speed lookups?

Also, using split does more work than you need. Try replacing

I personally believe that people indeed tend to overuse split too much. But at the same time IIRC the latter is optimized if an explicit LIMIT parameter and maybe (I only have a vague memory of this, and I admit I may just have "invented" it...) even simply if a specific number of items are assigned, i.e.:

my ($searchfield) = split /'/, $line;

Update: as far as the last point is concerned, I definitely stand corrected, as per ikegami's remark, which I thoroughly trust.

But at this point one should certainly do a benchmark to be sure, and I don't have the slightest intention of doing so, especially given that the question asked by the OP has bigger issues to the point of not really being understandable at all, as far as I'm concerned...

--
If you can't understand the incipit, then please check the IPB Campaign.

Replies are listed 'Best First'.
Re^3: how to speed lookups?
by ikegami (Patriarch) on Nov 12, 2008 at 19:39 UTC

    While the OP mentions fetching the first field, you'll notice the OP used $fields[1], not $fields[0]. I believe that means he's using split to parse a single-quoted string. That's not what I'd call an appropriate use of split.

    So in this case, the optimal split would be

    my $searchfield = ( split /'/, $line, 3 )[1];

    Using split requires matching twice, creating three variables and copying the entire string.

    my ($searchfield) = $line =~ /^'([^']*)/;

    Using the match operator requires matching once, creating one variable and copying only the field. Actual performance aside, it's definitely a cleaner process.

    Finally, split will be very bad at handling escaping when the OP discovers the need for it.

    maybe ([...]) even simply if a specific number of items are assigned

    An operand doesn't know what the caller will do with the returned list, so your "maybe" doesn't apply. If it behaves as you think, the following snippet will result in $c being assigned 2 when it should be assigned 3.

    $c = ($f1,$f2) = (4,5,6);