|
| Størrelse på strings i Perl Fra : Thomas Skyt |
Dato : 19-07-04 19:01 |
|
Hej,
jeg har et problem med et stykke kode jeg skriver. En linie tekst i
source-filen, som koden skal behandle, er på mere end 128 kilobytes og
Perl stopper behandlingen af linien såsnart stringen når op på den
størrelse.
Er der nogen mulighed for at forøge den maksimale størrelse på en
string eller kan jeg omgå problemet ved at stoppe linien ind i et array
(evt. ved at dele det op i elementer, efterhånden som behandlingen
skrider frem)?
/Thomas
| |
Lars Balker Rasmusse~ (19-07-2004)
| Kommentar Fra : Lars Balker Rasmusse~ |
Dato : 19-07-04 19:23 |
|
Thomas Skyt <thomas@sofagang.dk> writes:
> jeg har et problem med et stykke kode jeg skriver. En linie tekst i
> source-filen, som koden skal behandle, er på mere end 128 kilobytes og
> Perl stopper behandlingen af linien såsnart stringen når op på den
> størrelse.
Det tror jeg ikke på:
$foo = "foo" x 1000000;
print length $foo;
print substr $foo, 0, 10;
substr($foo, 2999993) = "bar";
print substr $foo, 2999990;
Hvad er det præcist du gør ved strengen?
--
Lars Balker Rasmussen Consult::Perl
http://consult-perl.dk
| |
Thomas Skyt (19-07-2004)
| Kommentar Fra : Thomas Skyt |
Dato : 19-07-04 19:32 |
|
Hej,
On Mon, 19 Jul 2004 20:23:18 +0200, Lars Balker Rasmussen wrote:
> Thomas Skyt <thomas@sofagang.dk> writes:
>> jeg har et problem med et stykke kode jeg skriver. En linie tekst i
>> source-filen, som koden skal behandle, er på mere end 128 kilobytes og
>> Perl stopper behandlingen af linien såsnart stringen når op på den
>> størrelse.
>
> Det tror jeg ikke på:
>
> $foo = "foo" x 1000000;
> print length $foo;
> print substr $foo, 0, 10;
> substr($foo, 2999993) = "bar";
> print substr $foo, 2999990;
>
> Hvad er det præcist du gør ved strengen?
Dette:
sub ReadInterestingParts {
#
# Reads a URL and returns the contents as a string
#
$url = shift @_;
print "Fetching $url ... ";
$URLstatus = getstore($url,"/tmp/dgidigger.tmp");
print "HTTP $URLstatus.\n";
$startStore = 0;
open TEMPFILE, "</tmp/dgidigger.tmp";
while(<TEMPFILE>) {
$line = $_; chomp($line);
if($startStore == 1) {
$InterestingPart .= $line;
print $line."\n";
}
if($line =~ /<!-- Top slut -->/) {
$startStore = 1;
}
if($line =~ /<!-- Bund ASP 3.0 -->/) {
$startStore = 0;
print "SLUT: $line\n";
}
}
close(TEMPFILE);
return $InterestingPart;
}
Den kan fint læse URL'en og hakke tekst-filen i stykker og slutter som
sagt 128 kbytes ude ad den ene linie.
/Thomas
| |
Tore Aursand (19-07-2004)
| Kommentar Fra : Tore Aursand |
Dato : 19-07-04 22:31 |
|
On Mon, 19 Jul 2004 20:32:14 +0200, Thomas Skyt wrote:
> sub ReadInterestingParts {
Sørg for å bruke 'strict' og 'warnings' når du programmerer;
#!/usr/bin/perl
#
use strict;
use warnings;
Jeg har ikke svaret på spørsmålet du _egentlig_ hadde, men jeg tror jeg
har en ganske mye bedre måte å skrive funksjonen ovenfor på (utestet);
sub ReadInterestingParts {
my $url = shift;
my $tmp = get( $url );
my $InterestingPart;
if ( defined $tmp ) {
while ( $tmp =~ m,<!-- Top -->\n?(.*?)\n?<!-- Bund -->,sig ) {
$InterestingPart .= $1;
}
}
return $InterestingPart;
}
Akkurat det som matches forkortet jeg litt for at ikke linjen skulle bli
så lang. Regner med at du ser hvordan du retter på det.
Lykke til!
--
Tore Aursand <tore@aursand.no>
"Computer language design is just like a stroll in the park. Jurassic
Park, that is." (Larry Wall)
| |
Thomas Skyt (20-07-2004)
| Kommentar Fra : Thomas Skyt |
Dato : 20-07-04 01:16 |
|
Hej,
On Mon, 19 Jul 2004 23:31:17 +0200, Tore Aursand wrote:
> Sørg for å bruke 'strict' og 'warnings' når du programmerer;
Jeg ved det ... det er en dårlig vane, ikke at gøre det, men når jeg
liiiige har en ide, glemmer jeg det tit.
> Jeg har ikke svaret på spørsmålet du _egentlig_ hadde, men jeg tror
> jeg har en ganske mye bedre måte å skrive funksjonen ovenfor på
> (utestet);
>
> [GOD IDE TIL KODE]
Jeg kan se, hvor du vil hen med det og tror jeg vil forsøge at mase det
ind.
/Thomas
| |
Lars Balker Rasmusse~ (19-07-2004)
| Kommentar Fra : Lars Balker Rasmusse~ |
Dato : 19-07-04 19:41 |
|
Thomas Skyt <thomas@sofagang.dk> writes:
> Den kan fint læse URL'en og hakke tekst-filen i stykker og slutter som
> sagt 128 kbytes ude ad den ene linie.
Er det en enkelt $line eller $InterestingPart der max kommer 128K i?
Hvis det er en linie, har du checket om der kommer mere end de 128K i
tekst-filen?
--
Lars Balker Rasmussen Consult::Perl
http://consult-perl.dk
| |
Thomas Skyt (19-07-2004)
| Kommentar Fra : Thomas Skyt |
Dato : 19-07-04 20:21 |
|
On Mon, 19 Jul 2004 20:41:00 +0200, Lars Balker Rasmussen wrote:
> Thomas Skyt <thomas@sofagang.dk> writes:
>> Den kan fint læse URL'en og hakke tekst-filen i stykker og slutter som
>> sagt 128 kbytes ude ad den ene linie.
>
> Er det en enkelt $line eller $InterestingPart der max kommer 128K i?
Det lader til at det ikke er nogen af delene - linien er på 134821 bytes
og $InterestingPart vokser til 135143 bytes.
Jeg tror snarere at det er ved return ud af sub'en at den går galt.
/Thomas
(som lige tager en pause for at få klaret bolden op)
| |
|
|