[an error occurred while processing this directive] [an error occurred while processing this directive][an error occurred while processing this directive] [an error occurred while processing this directive] [an error occurred while processing this directive] [an error occurred while processing this directive] (none) [an error occurred while processing this directive] [an error occurred while processing this directive] [an error occurred while processing this directive] [an error occurred while processing this directive] [an error occurred while processing this directive][an error occurred while processing this directive] [an error occurred while processing this directive][an error occurred while processing this directive] [an error occurred while processing this directive][an error occurred while processing this directive] [an error occurred while processing this directive] [an error occurred while processing this directive] [an error occurred while processing this directive] (none) [an error occurred while processing this directive] [an error occurred while processing this directive] [an error occurred while processing this directive][an error occurred while processing this directive]
 
[an error occurred while processing this directive] [an error occurred while processing this directive]
Skåne Sjælland Linux User Group - http://www.sslug.dk Home   Subscribe   Mail Archive   Forum   Calendar   Search
MhonArc Date: [Date Prev] [Date Index] [Date Next]   Thread: [Date Prev] [Thread Index] [Date Next]   MhonArc
 

Re: [PROGRAMMERING] Skrive til en bestemt position i en fil i perl



Så var Jonas så lidt hurtiger til at læse sin perldoc end jeg var, men her er 
der et eksempel på hvordan du bruger det:

open FILE, "+</tmp/minfil" or die ("Could not open file");
# Seek to minus 4 from end.
seek FILE, -4, 2;
print(tell(FILE). "\n");

my $buff;
# Read 4 bytes.
read(FILE,$buff,4);
print "buff:$buff\n";

# Seek back the 4 bytes from current pos.
seek(FILE, -4, 1);

# Replace stuff.
$buff =~ s/CCC/DDD/;
print FILE $buff;
print(tell(FILE). "\n");

close FILE;

Til det med min LaTeX precompiler så er det eksemple på hvordan du laver 
multiline matchings med regexp:

my $filename = "/tmp/minfil";

open FILE, "$filename" or die("Could not open $filename");
my $buff = do { local $/, <FILE> };
chomp($buff);
close FILE;

my @sqlcode = ($buff =~
        /<sql>
        (.*?)
        <\/sql>/sxg);

foreach my $var (@sqlcode) {
        print "$var\n";
}

/tmp/minfile:
<sql>
A
</sql>

<sql>
B
</sql>

Men jeg hvis jeg var dig vil jeg nok hold mig til at slurpe file ind i 
hukommelsen, 5MB er stadig i bagatel afdelingen og du skal ikke rode særligt 
meget rundt i seek og read før en hurtig slurp og en regexp ikke ville have 
været hurtigere.

Mvh Troels.

On Monday 14 June 2004 11:33, Jonas Jensen wrote:
> On Sun, 13 Jun 2004 22:22:01 +0000, Hanne Munkholm wrote:
> > On 2004-06-12, Troels Liebe Bentsen <sslug@sslug> wrote:
> >>  Det er fordi du åbner filen i "append mode", du skal bare bruge en
> >>  open(FILE, "$XMLFILE");
> >
> > Filehandle FILE opened only for input at ./printusers.pl line 165. :-(
>
> Det skal være:
> open(FILE, "+<$XMLFILE");
>
> >>  Og generalt er det en dårlig ide at læse/skrive direkt i en fil, så
> >>  længe filen kan være i hukommelse er det bedre bare at slurpe den op
> >>  og så skrive den igen når man er færdig.
> >>
> >>  open FILE, "$filename" or die("Could not open $filename"); my $buff =
> >>  do { local $/, <FILE> };
> >>  chomp($buff);
> >>  close FILE;
> >
> > Ok. Den bliver nok 4-5 MB i første omgang. Så det er en sjat. Men det er
> > vel hurtigere at have det i memory når først man før det indlæsst. Det
> > er bare irriterende at skulle tygge alle de data igennem før at tilføke
> > 20 linier i bunden :( Bortset fra at det er i bunden minus een linie.
>
> Du kan gøre det nemmere, og mere memory-venligt:
> - Åbn filen som jeg skrev oven over. Det vil åbne den for både læsning
> og skrivning.
> - Hvis din data altid skal tilføjes på samme sted i forhold til filens
> slutning, kan du bare seek()'e derhen med WHENCE = SEEK_END og en negativ
> POSITION. Ellers må du læse dig lidt frem til positionen.
> - Skriv din data med "print FILE $linje".
> - Skriv afslutningen på yder-tag'et og luk filen.
>
> Den metode ignorerer at det er en xml fil, men jeg vil tro den har 20-50
> gange så høj performance som hvis du brugte et xml-opmærksomt værktøj.


 
Home   Subscribe   Mail Archive   Index   Calendar   Search

 
 
Questions about the web-pages to <www_admin>. Last modified 2005-08-10, 22:43 CEST [an error occurred while processing this directive]
This page is maintained by [an error occurred while processing this directive]MHonArc [an error occurred while processing this directive] # [an error occurred while processing this directive] *