Beefy Boxes and Bandwidth Generously Provided by pair Networks
Syntactic Confectionery Delight
 
PerlMonks  

Re: Re: Re: Re: C vs perl

by abstracts (Hermit)
on Apr 29, 2002 at 02:09 UTC ( [id://162740]=note: print w/replies, xml ) Need Help??


in reply to Re: Re: Re: C vs perl
in thread C vs perl

One way to do it is by allocating string of length:
newlen = (strlen(str) * strlen("</p><p>")) / strlen("\r\n") + strlen("</p><p>") + 1;
which is in this case 3.5 times the length of the original string. This is the total number of bytes required in the worst case scenario: $str =~ /(\r\n)*/. Excessive memory can be reclaimed by doing a realloc *after* the substitution.

As for perl's internal implementation, it's a different issue as the regex engine must work with any regex given. But even with that in mind, you can still build a linked list of offsets and lengths of parts in the original strings that need to copied over, as well as another list of substitutions. The required amount of memory should be easy to compute and will require doing a single copy only.

For this example, this is like doing:

my $str = 'line1\r\nline2\r\n"; my $result = join '</p><p>', split(/\r\n/, $str);

Replies are listed 'Best First'.
Re: Re: Re: Re: Re: C vs perl
by samtregar (Abbot) on Apr 29, 2002 at 03:22 UTC
    That sure sounds good, but I'm not sure I'd be thrilled with the results of passing this routine 3MB of text and having it malloc() 10MB. The efficacy of malloc()ing far more than you need then hoping that realloc() is cool enough to make it not matter is questionable.

    -sam

Log In?
Username:
Password:

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

How do I use this?Last hourOther CB clients
Other Users?
Others studying the Monastery: (5)
As of 2024-04-20 00:05 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    No recent polls found