/ Forside / Teknologi / Udvikling / Perl / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
Perl
#NavnPoint
bjarneA 141
poul_from 50
soccer 30
Nicknack 14
Tmpj 0
Fjern \n i start og slut af text
Fra : Lars Kim Lund


Dato : 03-02-01 21:12


Hej.

Har en tekstfil, der har et ikke-fast antal \n i starten og slutningen
af filen.

\n
\n
tekst
tekst
\n
tekst
\n
tekst
\n
\n
\n
<EOF>

De første og sidste \n vil jeg fjerne. Jeg har lavet flg. rutine

open (FOO, $bar) or die();
@dat = <FOO>;
close FOO;

do {$trim = shift @dat} until ($trim ne "\n");
unshift @dat,$trim;

do {$trim = pop @dat} until ($trim ne "\n");
push @dat, $trim;

Er der en lettere måde?

--
Lars Kim Lund
http://www.net-faq.dk/

 
 
Jakob Schmidt (04-02-2001)
Kommentar
Fra : Jakob Schmidt


Dato : 04-02-01 00:11

Lars Kim Lund <larskim@mail.com> writes:

> De første og sidste \n vil jeg fjerne. Jeg har lavet flg. rutine
>
> open (FOO, $bar) or die();
> @dat = <FOO>;
> close FOO;
>
> do {$trim = shift @dat} until ($trim ne "\n");
> unshift @dat,$trim;
>
> do {$trim = pop @dat} until ($trim ne "\n");
> push @dat, $trim;
>
> Er der en lettere måde?

Jeg synes din måde er meget let at forstå, og det er en stor styrke. Selv
ville jeg helt sikkert tænke på effektiviteten og gøre noget i retning af

while ( <FOO> ) {
last unless $_ eq "\n";
}
my @dat = ( $_ ); # begynd optagelsen
my $l = 0;
while ( <FOO> ) {
push @dat, $_;
$l = $#dat unless $_ eq "\n";
}
$#dat = $l; # klip optagelsen til til sidste ikke blanke linie

i stedet - men for det første gider jeg ikke at teste, om det nu også
faktisk er mere effektivt, hvilket slet ikke er sikkert (det vil nok afhænge
af dataene); for det andet er det sikkert ikke så let at forstå.
Det er bare den måde, jeg umiddelbart ville tænke, hvis det skal være et
array.

En anden oplagt løsning ville være at læse skidtet ind som tekststreng
i stedet for array (ved at undef'e $/), og så bruge substitution

undef $/; # evt. brug "local-idiomet"
my $dat = <FOO>;
$dat =~ s/^\n*//;
$dat =~ s/\n*$/\n/; # du vil jo gerne beholde linieskiftet som afslutter
# den sidste rigtige linie

(og splitte $dat til slut, hvis det partout skal give et array som resultat).

Det kunne da være interesant, hvis nogen gad prøve at Benchmarke dem...

--
Jakob Schmidt
http://aut.dk/orqwood
etc.

Lars Kim Lund (04-02-2001)
Kommentar
Fra : Lars Kim Lund


Dato : 04-02-01 01:03

Hej Jakob Schmidt <sumus@aut.dk>

>> open (FOO, $bar) or die();
>> @dat = <FOO>;
>> close FOO;
>>
>> do {$trim = shift @dat} until ($trim ne "\n");
>> unshift @dat,$trim;
>>
>> do {$trim = pop @dat} until ($trim ne "\n");
>> push @dat, $trim;

>undef $/; # evt. brug "local-idiomet"
>my $dat = <FOO>;
>$dat =~ s/^\n*//;
>$dat =~ s/\n*$/\n/; # du vil jo gerne beholde linieskiftet som afslutter

Det havde jeg også overvejet, men er to regexps ikke dyrere end et par
array-operationer?

>Det kunne da være interesant, hvis nogen gad prøve at Benchmarke dem...

Det drejer sig godt nok kom om tekst på 50-100 linier, så effektivitet
og hastighed er ret teoretisk. Jeg tænkte blot på om der var en perlsk
måde at gøre det bedre på.

--
Lars Kim Lund
http://www.net-faq.dk/

Jakob Schmidt (04-02-2001)
Kommentar
Fra : Jakob Schmidt


Dato : 04-02-01 01:19

Lars Kim Lund <larskim@mail.com> writes:

> Hej Jakob Schmidt <sumus@aut.dk>
> >
> >undef $/; # evt. brug "local-idiomet"
> >my $dat = <FOO>;
> >$dat =~ s/^\n*//;
> >$dat =~ s/\n*$/\n/; # du vil jo gerne beholde linieskiftet som afslutter
>
> Det havde jeg også overvejet, men er to regexps ikke dyrere end et par
> array-operationer?

Jeg ved det ikke - de to regexps er i den helt billige ende, hvorimod
unshift (intuitivt) må være lidt halvdyr. Det afhænger af dataene, vil
jeg tro.

Den sidste af substitutionerne kan forresten udskiftes med chomp(), hvilket
sikkert er betydelig mere effektivt - men så æder den altså også anden
trailing whitespace end \n, og det var jo ikke de, du bad om.

> Det drejer sig godt nok kom om tekst på 50-100 linier, så effektivitet
> og hastighed er ret teoretisk.

Jajaja - og som bekendt er det som regel meget værre med den tid, men spilder
på at prøve at lave tingene effektive...

> Jeg tænkte blot på om der var en perlsk
> måde at gøre det bedre på.

Thja - ikke noget, der lige slog mig. Men der er jo nok noget.

--
Jakob Schmidt
http://aut.dk/orqwood
etc.

Peter J. Acklam (05-02-2001)
Kommentar
Fra : Peter J. Acklam


Dato : 05-02-01 10:09

Lars Kim Lund <larskim@mail.com> writes:

> De første og sidste \n vil jeg fjerne. [...]

# read data in file slurp mode
local $/ = undef;
open FILE, $file or die "...";
my $data = <FILE>;
close FILE;

# clean up the data
$data =~ s/\A\n+//; # strip leading \n
$data =~ s/\n+\z//; # strip trailing \n

Peter

--
$\="\n";$_='The quick brown fox jumps over the lazy dog';print +(split
//)[20,5,24,31,3,36,14,12,31,1,2,11,9,23,33,29,35,15,32,36,7,8,28,29];

Søg
Reklame
Statistik
Spørgsmål : 177560
Tips : 31968
Nyheder : 719565
Indlæg : 6408943
Brugere : 218888

Månedens bedste
Årets bedste
Sidste års bedste