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.