Beefy Boxes and Bandwidth Generously Provided by pair Networks
The stupid question is the question not asked
 
PerlMonks  

Re: How to remove character at certain position in the String.....

by l3nz (Friar)
on Dec 02, 2003 at 09:35 UTC ( [id://311564]=note: print w/replies, xml ) Need Help??


in reply to How to remove character at certain position in the String.....

I'd probably do it with substr, usually, but you can do it using a regexp too. As the regexp does not match if you do not have enough chars, you do not have to worry about malformed strings (you only 'touch' strings that are meaningful).

This is a sample:

use strict; my $a; my $from = 2; my $len = 2; while( $a = <DATA> ) { chomp $a; print "Before: '$a' "; $a = $1 . $2 if $a =~ /^(.{$from}).{$len}(.*)$/i; print "After '$a'\n"; } __DATA__ 12345678 yellow a xx yyy
  • Comment on Re: How to remove character at certain position in the String.....
  • Download Code

Replies are listed 'Best First'.
Re: Re: How to remove character at certain position in the String.....
by jweed (Chaplain) on Dec 02, 2003 at 09:43 UTC
    I would use qr// to compile the regex before the loop so you don't have the (potentially) large overhead each iteration.

    Update

    I am wrong. Do not listen to me.



    Who is Kayser Söze?
      What potential overhead? Perl will *not* recompile the regex in each iteration (unless you modify $from or $len). Here's a proof, assuming the program is in the file /tmp/qq:
      $ perl -Dr /tmp/qq 2>&1 | grep Compiling Compiling REx `^(.{2}).{2}(.*)$' $
      It only gets compiled once.

      Here's a benchmark:

      #!/usr/bin/perl use strict; use warnings; use Benchmark 'cmpthese'; our @data = <DATA>; chomp @data; our $from = 2; our $len = 2; our (@a, @b, @c); cmpthese -10 => { substr => 'for (@a = @data) { substr $_, $from, $len, "" if length ($_) >= $fro +m + $len }', regex => 'for (@b = @data) { $_ = $1 . $2 if /^(.{$from}).{$len}(.*)$/; }', regex_qr => 'my $qr = qr /^(.{$from}).{$len}(.*)$/; for (@c = @data) { $_ = $1 . $2 if /$qr/; }', }; die "Unequal" unless "@a" eq "@b" && "@b" eq "@c"; __DATA__ 12345678 yellow a xx yyy a somewhat longer line to compensate for the smaller lines. bla bla bla bla Rate regex_qr regex substr regex_qr 38207/s -- -3% -62% regex 39497/s 3% -- -60% substr 99555/s 161% 152% --

      Abigail

        Interesting!

        Like jweed, I knew that if you use /$variable/ in a cycle, it gets recompiled at each iteration, even if $variable doesn't change.

        Since I am sure I read that in a far away day in the past ;-) I suppose that it worked that way before, so it must have changed at some point. Could anybody tell at which version of Perl that behaviour changed?

        Thanks

        Ciao!
        --bronto


        The very nature of Perl to be like natural language--inconsistant and full of dwim and special cases--makes it impossible to know it all without simply memorizing the documentation (which is not complete or totally correct anyway).
        --John M. Dlugosz

Log In?
Username:
Password:

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

How do I use this?Last hourOther CB clients
Other Users?
Others goofing around in the Monastery: (3)
As of 2024-04-24 02:49 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    No recent polls found