Message from discussion
Rekenbewerking op text file
Path: g2news1.google.com!news1.google.com!fu-berlin.de!uni-berlin.de!individual.net!not-for-mail
From: John Bokma <postmas...@castleamber.com>
Newsgroups: nl.comp.os.linux.programmeren
Subject: Re: Rekenbewerking op text file
Date: 24 Feb 2005 18:13:04 GMT
Organization: Castle Amber - software development
Lines: 142
Message-ID: <Xns96077C48F1183castleamber@130.133.1.4>
References: <slrnd1loso.emr.root@dragonhill.xs4all.nl> <newscache$hpbbci$x9d$1@news.emea.compuware.com> <slrnd1ra6j.s09.root@dragonhill.xs4all.nl>
X-Trace: individual.net Qd975rE7n91eCHcXjnqD5gnouYdtURemKeIYORhGtP12uj1qXE
User-Agent: Xnews/5.04.25
X-Face: $7h&5K*ZL9*ZQ\6Hco2"V?1dD*C<ab^>zlws[S%i0b,@gKk|[,)Y-<hk143{.Ov"x{({zo( l,N\m`-_^nJfVQdEyt+-uAP^7WG]5mHj9&::7X-qK;Yv;xmRvNWQR"_igw+cr5WMj;6:zlj<R80Ei@ $gGWq&*{FL*kC*a
Kees de Koster wrote:
> #v+
> #!/usr/bin/perl
Erg belangrijk om hier direct neer te zetten:
use strict;
use warnings;
> if ($#ARGV != 2) {
> print "usage: input-file output-file factor\n";
> exit;
> }
leesbaarder:
unless ( @ARGV == 3 ) {
print ...
exit;
}
> $inputfile = $ARGV[0];
> $outputfile = $ARGV[1];
> $factor = $ARGV[2];
my ( $inputfile, $outputfile, $factor ) = @ARGV;
> open(IF, $inputfile);
or die "Can't open '$inputfile' for reading: $!";
> open(OF, ">$outputfile");
idem.
Met een recente versie van Perl kan je ook:
open my $if, $inputfile or die...
open my $of, '>', $outputfile or die ...
doen
> my $line;
stop in de while
> my ($bl, $el);
stop in de while
> my @numbers;
> my $volume;
ditto
>
> while ($line = <IF>) {
> ($bl, $el) = split /=/, $line;
> if ($bl > 19000000000000) {
> @numbers = split /,/, $el;
> $volume = pop @numbers;
while ( my $line = <$if> ) {
my ( $bl, $el ) = split /=/, $line;
unless ( $bl > 19000000000000 )
print $of $line;
next;
}
Dit is leesbaarder (vind ik), indien er niks te doen is, next.
@numbers = split /,/, $el;
$volume = pop @numbers;
Let op: $volume kan een \n bevatten, maar door
de vermenigvuldiging verderop raak je die kwijt.
> @numbers = map {$_ * $factor} @numbers;
doe ik later :-D.
> use integer;
ai, dat is vrij ticky, sterker, ik zou het ergens weer uitzetten.
> $volume = $volume / $factor;
$volume = int( $volume / $factor );
> print OF $bl;
> print OF "=";
> print OF join "", map {"$_,"} @numbers;
> print OF $volume;
> print OF "\n";
print "$bl=",
join ( ",", map { $_ * $factor } @numbers ),
",volume\n";
> } else {
> print OF $line;
> }
> }
>
> close(IF);
close $if or die "Can't close ... $!"; # [1]
> Er zullen wel wat niet zulk mooie constructies inzitten maar tis m'n
> eerste Perl progje, ga vanmiddag naar de bieb een Perl boek zoeken.
Probeer Learning Perl (O'Reilly) en Perl Cookbook (O'Reilly) te pakken
te krijgen.
[1] recent gehad dat dit echt faalde, de buffer werd door de close weg
geschreven, en .... er was geen ruimte meer op de HD :-D. Als je het
helemaal mooi wilt doen: ( print ...... ) or die ...
[2] En de Koos speciaal voor vandaag:
#!perl -spaF[=,]
next unless $F[0] > 19000000000000;
$_ = "$F[ 0 ]=" . join ',', (
map { $_ * $factor } @F[ 1..4 ]
), int( $F[ 5 ] / $factor ) . "\n"
convert.pl -factor=4 in.txt > out.txt
--
John Bokma
Voorbeeldscripts in Perl: http://johnbokma.com/perl/
Ervaren Perl / Java programmeur beschikbaar: http://castleamber.com/
Tevreden opdrachtgevers: http://castleamber.com/testimonials.html