Perl a velky skalar

Pavel ©merk xsmerk na informatics.muni.cz
Středa Duben 4 12:07:56 MEST 2001


Honza Pazdziora wrote:

> On Wed, 4 Apr 2001 09:13:40 GMT, Pavel ©merk <xsmerk na informatics.muni.cz> wrote:
>         for ($vse) {
>                 s/neco/toto/g;
>         }
>
> a ten aliasing mas zadarmo.

To me mohlo napadnout. Diky za obe varianty.

> > Dalsi nejasnost - mam soubor a chci v nem udelat nejake nahrady. Muzu ho
> > cist po nejakych kusech, delat nahrady a zase zapisovat. Taky ho muzu
> > precist cely naraz, udelat nahrady a zapsat. Je neco z toho rychlejsi?
>
> Zalezi. Zalezi, jak ty nahrady delas a co predpokladas o tech datech.

A kde se to da zjistit, jak a na cem to zalezi? - samozrejme bych tu mohl popsat
jeden konkretni pripad, ale zajimalo by me to i obecne.

> > Nejvaznejsi problem mam ale tento: mam 20MB v $_, program zabira neco
> > pres 20MB. Udelam nekolik prikazu typu "s/...(...)...(...).../.../sg;",
> > $_ ma stale zhruba 20MB, ovsem program zabira skoro 300MB pameti. Pokud
> > jsem to spravne sledoval, kazde to nahrazeni zvetsi zabiranou pamet. Nic
> > jineho krome s///sg nedelam. Jak je to mozne a jak se tomu lze branit?
> > (Zkusil jsem to psat jako "1 while s///s;", to tu pamet nakonec zabralo
> > taky, jenom to bylo asi 30krat pomalejsi.)
>
> Potrebujeme videt presny kod.

$_ mel neco pres 8MB, kazdy z nasledujicich radku (takto jdou za sebou v programu),
krome my ... a warn ... zvetsil zabiranou pamet zhruba taky o tolik (my ... naopak
zabiranou pamet nijak dramaticky nezvetsi).

s/ *(\n\n) *(<\/\d+>)/$2$1/sg;
s/(<\d+>) *(\n\n) */$2$1/sg;
s/<(\d+)>([^<]*)\n\n([^<\n]*)<\/\1>/<$1>$2<\/$1>\n\n<$1>$3<\/$1>/sg;
my @vysl = (/\n\n(?!<102[20])(.*?)\n/sg);
warn "...:\n", join "\n", @vysl, "" if @vysl;
s/-\n([^ <\n]+)/$1\n/sg;

Diky

P.




Daląí informace o konferenci Perl