Beefy Boxes and Bandwidth Generously Provided by pair Networks
No such thing as a small change

Re: Huge simple problem

by dreadpiratepeter (Priest)
on Aug 05, 2009 at 22:43 UTC ( #786247=note: print w/replies, xml ) Need Help??

in reply to Huge simple problem

May I suggest that you learn to use the foreach loop in Perl, rather than the c-style for loop.
my @searchTexts = split (/and|or/i,$query); foreach my $text (@searchtexts) { $text =~ s/^\s+//; $text =~ s/\s+$//; print "$text\n"; }
and in a loop this simple I would just use $_
foreach (split /and|or/i,$query) { s/^\s*(.*?)\s*$/$1/; print "$_\n"; }
or reduce it even further with a map and a join (depends on circumstance, if I'm the not only maintainer I'd probably use the above version)
print join("\n",map {/^\s*(.*?)\s*$/;$1} split(/and|or/i,$query)) . "\ +n";
all the above code is untested.

update: also you could first clean the ends of $query (with s/^\s*(.*?)\s*$/). Then if you change the slip condition to /\s*(?:and|or)\s*/ you can skip the map:
print join("n\",split(/\s*(?:and|or)\s*/,$query)) . "\n";
of course at this point you can skip the whole split and use:
$query =~ s/\s*(?:and|or)\s*/\n/g; print "$query\n";
A final note, all these will fail horribly if your data has and/or imbedded in words. ie world. You probably want to split on /\s+(?:and|or)\s+/ or /\s*\b(?:and|or)\b\s*/

Phew, now I need a nap

"Worry is like a rocking chair. It gives you something to do, but it doesn't get you anywhere."

Replies are listed 'Best First'.
Re^2: Huge simple problem
by dsheroh (Prior) on Aug 06, 2009 at 00:04 UTC
    May I suggest that you learn to use the foreach loop in Perl, rather than the c-style for loop.

    Do note that foreach is just an alternate spelling of for. for my $text (@searchtexts) { ... } is exactly equivalent to foreach my $text (@searchtexts) { ... }.

    Either way, though, I can't remember the last time I used a C-style for loop in Perl. for ( [list] ) is so much nicer and avoids all those nasty off-by-one errors.

      I second this advice, and (missingthepoint posting anonymously), ++ to you both for helpful replies (when I remember what I changed my password to).

      Also, may I suggest you use strict and use warnings? (put those two lines at the top of your code). It will save you a lot of time - I speak from painful experience :|

      One final word: it appears as though you're trying to get the number of elements in @a by writing @a +1 -1. That's contorted - you can just say $i <= @a, since <= puts its operands (that is, $i and @a) in scalar context, and for the array, produces the number of elements it contains.

      You can improve that even further, too. As it stands you have an off-by-one error - looping from $i = 0 to $i = @array<c> will put you one element beyond the end. If you need a C-style for loop, you can write: <c>for ($i = 0; $i < @a; $i++) { ... and be done with it. :)

      But in your situation, you would be better served just doing what dsheroh++ said and using a plain for: for my $element (@a) { <do something with element> ...

      Don't hesitate to let me know if that was unclear. :)

        ... and you already noticed (part of) that. Never mind, hopefully someone else benefits from that node.
      I always say foreach when doing (@a) type loops and for when doing c-style loops. helps make the code a little more self-documenting

      "Worry is like a rocking chair. It gives you something to do, but it doesn't get you anywhere."
Re^2: Huge simple problem
by Anonymous Monk on Aug 05, 2009 at 23:07 UTC
    Thanks for the help!

Log In?

What's my password?
Create A New User
Node Status?
node history
Node Type: note [id://786247]
[ambrus]: Today I accidentally cut my hand while carrying a computer. On the display part of the motherboard that sticks out at the back of the chasis and has ports, there's this thin metal sheet with holes cut for the ports, to guide plugs into the sockets.
[ambrus]: This sheet has sharp needle-like parts, 0.004 long and less than 0.001 wide, that can get bent to point outwards, and one of these cut into my palm when I lifted the box.
[ambrus]: So now when I choose what motherboard to buy for my new home computer, I have one more specific property to guide me. Useful, because there's so many different boards to choose from.

How do I use this? | Other CB clients
Other Users?
Others chilling in the Monastery: (7)
As of 2017-01-16 19:32 GMT
Find Nodes?
    Voting Booth?
    Do you watch meteor showers?

    Results (151 votes). Check out past polls.