Beefy Boxes and Bandwidth Generously Provided by pair Networks
Don't ask to ask, just ask
 
PerlMonks  

Re: replace/substituion 4th field

by 7stud (Deacon)
on Feb 20, 2013 at 18:10 UTC ( #1019817=note: print w/ replies, xml ) Need Help??


in reply to replace/substituion 4th field

$line =~ s/(.*)\,(.*)\,(.*)\,(.*)\,(.*)\,(.*)/

Why are you escaping all those commas? A comma has no special regex meaning. In a regex, a comma means one thing: a literal comma.

The pattern .* says to match ANY character, 0 or more times, GREEDILY. That means that the regex engine will match as many characters as possible. When the regex engine sees a pattern like:

(.*),

...the first thing the regex engine does is find a match for the part in parentheses. Your whole line matches that part, so the regex engine reads in your whole line as the match for (.*). Then the regex engine moves on to the comma. Because there are no characters remaining in the line to match against, the regex engine backs up one character, surrendering a character from what matched .*. Then the regex engine checks if the comma matches that character. No match. So the regex engine backs up another character, surrendering yet another character from what matched .*, and the regex engine checks again if that character matches the comma. So on and so on until the regex finds a match for the comma. That's inefficient.

A more efficient regex would be this:

([^,]+),([^,]+)

However, as tmharish already mentioned you already split() your data, so there is no reason to use a regex at all. Just change whatever pieces you want in @fields like this:

$fileds[3] = "hurray";

You can limit your split to 5 instead of on every comma, which will speed things up a little.

It is possible to do a conditional s///, like this:

$line =~ s/ ( (?: [^,]+ , ){3} ) ([^,]+) (.*) / $2 > 310 ? "$1volemd$3" : $2 == 70 ? "$1volemd1$3" : "$1$2$3" ; /exms;

(The /e flag stands for eval.) But that is much slower than split() + join().

There is no reason to use Text::CSV_XS or any other CSV module.


Comment on Re: replace/substituion 4th field
Select or Download Code
Re^2: replace/substituion 4th field
by Anonymous Monk on Feb 20, 2013 at 21:40 UTC

    • There is no reason to use Text::CSV_XS or any other CSV module. For a csv file? Why is that?
    • (The /e flag stands for eval.) No sir, the /e modifier does NOT means eval.
      This is what perlop said about it; A /e will cause the replacement portion to be treated as a full-fledged Perl expression and evaluated right then and there. It is, however, syntax checked at compile-time.
      It is when you have /ee, that the second "e" evaled, the expression. Please read it up.

      There is no reason to use Text::CSV_XS or any other CSV module. For a csv file? Why is that?

      Because perl natively supplies a simple and efficient tool to do what the op wants.

      It is evaled when you have /ee, that the second "e" evaled, the expression. Please read it up.

      I originally had two ee's, but that was so slow compared to split(), I changed it to one e.

      It is, however, syntax checked at compile-time.

      ++ perl savoir-faire.

Log In?
Username:
Password:

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

How do I use this? | Other CB clients
Other Users?
Others browsing the Monastery: (15)
As of 2015-07-01 19:26 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 (17 votes), past polls