Beefy Boxes and Bandwidth Generously Provided by pair Networks
XP is just a number
 
PerlMonks  

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


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


Comment on Re: Huge simple problem
Select or Download Code
Replies are listed 'Best First'.
Re^2: Huge simple problem
by dsheroh (Parson) 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


      -pete
      "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?
Username:
Password:

What's my password?
Create A New User
Node Status?
node history
Node Type: note [id://786247]
help
Chatterbox?
and the web crawler heard nothing...

How do I use this? | Other CB clients
Other Users?
Others avoiding work at the Monastery: (10)
As of 2015-07-29 11:08 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    The top three priorities of my open tasks are (in descending order of likelihood to be worked on) ...









    Results (263 votes), past polls