if in while oder if vor while?
if in while oder if vor while?
am 27.05.2006 15:57:26 von Chris Maanz
Guten Tag!
Ich durchsuche eine Datei nach einem Muster. Wobei ich beim Aufruf des
Perl-Scripts
2 Argumente mitgebe, das Suchmuster und die Angabe ob "alle" gefundenen
Records angezeigt werden sollen.
Was ist jetzt die elegantere Lösung? In der While-Schleife jedesmal mit if
zu checken ob "alle" angegeben war und
daher die Zeile anzuzeigen ist, oder vorher schon zu überprüfen ob "alle"
angegeben ist und für beide Fälle
eine eigene While-Schleife zu schreiben?
Von der Geschwindigkeit her ist es egal, ich konnte auch bei einer relativ
großen Datei (> 100 MB) keinen messbaren
Unterschied feststellen, obwohl in Variante 1 ja jedesmal mit if geprüft
wird, ob "alle" angegeben war.
Variante 1:
-----------
while () {
chomp;
if (/($us)/) { # Suchmuster in Variable $us
$var = $_; # in $var wird immer der letzte gefundene Record
gespeichert
$count++; # ein Zähler
if ($ARGV[1] eq "alle") { # ist "alle" angegeben, dann mit print
anzeigen
print $_;
}
}
}
Variante 2:
-----------
if ($ARGV[1] eq "alle") { # wenn "alle" dann durchlaufe diese
while-Schleife
while () {
chomp;
if (/($us)/) {
print $_;
$count++;
}
}
}
else { # sonst durchlaufe diese while-Schleife
while () {
chomp;
if (/($us)/) {
$var = $_;
$count++;
}
}
}
Re: if in while oder if vor while?
am 27.05.2006 17:41:29 von Mirco Wahab
Thus spoke Chris Maanz (on 2006-05-27 15:57):
> Ich durchsuche eine Datei nach einem Muster. Wobei ich beim Aufruf des
> Perl-Scripts 2 Argumente mitgebe, das Suchmuster und die Angabe ob
> "alle" gefundenen Records angezeigt werden sollen.
> Was ist jetzt die elegantere Lösung? In der While-Schleife jedesmal mit if
> zu checken ob "alle" angegeben war und daher die Zeile anzuzeigen ist, oder
> vorher schon zu überprüfen ob "alle" angegeben ist und für beide Fälle
> eine eigene While-Schleife zu schreiben?
Der "bessere Stil" ist imho der "Miffy-Style". Also klare
grossflächige einfache getrennte Strukturen im Programm.
> Von der Geschwindigkeit her ist es egal, ich konnte auch bei einer relativ
> großen Datei (> 100 MB) keinen messbaren Unterschied feststellen, obwohl
> in Variante 1 ja jedesmal mit if geprüft wird, ob "alle" angegeben war.
File-IO ist um Größenordnungen langsamer als ein Variablenvergleich, imho.
> Variante 1:
> [single loop]
> Variante 2:
> [code duplication]
Zwei identische Codeblöcke, die sich nur
durch das aussparen eines If unterscheiden,
ist sicherlich schlechter Stil (imho).
Was die Geschwindigkeit von Perl-Programmen
betrifft, so ist imho das Programm "am schnellsten",
- das am schnellsten geschrieben werden kann (einfache Struktur)
- das am schnellsten von jemandem verstanden werden kann
- das am schnellsten bei Problemen korrigiert werden kann
Alle anderen "Schnelligkeitsaspekte" von Perl halte
ich in 99/100 Fällen für esoterisch.
Wenn Du mit Deiner Variante 1 glücklich bist,
würde ich diese so beibehalten. Ich hätte
wahrscheinlich folgenden Ansatz gewählt
(ohne Kenntniss Deines Regexes):
#!/usr/bin/perl
use strict;
use warnings;
# initialization part
my ($filename, $option) = (shift, shift);
my $verbose = 1; # nimm erstmal 'alle' an
my $us = 'Geschwindigkeit'; # ;-))
my $pattern = qr/($us)/;
my $var;
# file operations
open( my $datei, "<", $filename ) || die "error open: $!";
$_ = do{ local $/, (<$datei>) };
close( $datei );
# pattern suche
$verbose = undef if (not defined $option or $option ne 'alle');
while( /$pattern/g ) {
print "$1, \n" if defined $verbose;
$var = $1;
}
print "letzter war: $var\n";
__END__
Viele Grüße
Mirco
Re: if in while oder if vor while?
am 27.05.2006 17:59:30 von Mirco Wahab
Thus spoke Chris Maanz (on 2006-05-27 15:57):
> Ich durchsuche eine Datei nach einem Muster. Wobei ich beim Aufruf des
> Perl-Scripts 2 Argumente mitgebe, das Suchmuster und die Angabe ob
> "alle" gefundenen Records angezeigt werden sollen.
> Was ist jetzt die elegantere Lösung? In der While-Schleife jedesmal mit if
> zu checken ob "alle" angegeben war und daher die Zeile anzuzeigen ist, oder
> vorher schon zu überprüfen ob "alle" angegeben ist und für beide Fälle
> eine eigene While-Schleife zu schreiben?
Der "bessere Stil" ist imho der "Miffy-Style". Also klare
"grossflächige einfache" getrennte Strukturen im Programm.
> Von der Geschwindigkeit her ist es egal, ich konnte auch bei einer relativ
> großen Datei (> 100 MB) keinen messbaren Unterschied feststellen, obwohl
> in Variante 1 ja jedesmal mit if geprüft wird, ob "alle" angegeben war.
File-IO ist um Größenordnungen langsamer als ein Variablenvergleich, imho.
> Variante 1:
> [single loop]
> Variante 2:
> [code duplication]
Zwei identische Codeblöcke, die sich nur
durch das aussparen eines If unterscheiden,
ist sicherlich schlechter Stil (imho).
Was die Geschwindigkeit von Perl-Programmen
betrifft, so ist imho das Programm "am schnellsten",
- das am schnellsten geschrieben werden kann (einfache Struktur)
- das am schnellsten von jemandem verstanden werden kann
- das am schnellsten bei Problemen korrigiert werden kann
Alle anderen "Schnelligkeitsaspekte" von Perl halte
ich in 99/100 Fällen für esoterisch.
Wenn Du mit Deiner Variante 1 glücklich bist,
würde ich diese so beibehalten. Ich hätte
wahrscheinlich folgenden Ansatz gewählt
(ohne Kenntniss Deines Regexes):
#!/usr/bin/perl
use strict;
use warnings;
# Initialisierungsteil
my ($filename, $option) = (shift, shift);
my ($var, $count, $verbose) = (0,0,1); # nimm erstmal 'alle' an
my $us = 'Geschwindigkeit'; # suche dieses Wort
my $pattern = qr/([^\n].*$us[^\n].*)/m; # und gib die ganze Zeile aus
# Datei Operationen
open( my $datei, "<", $filename ) || die "error open: $!";
$_ = do{ local $/, (<$datei>) }; # Datei komplett in $_ einlesen
close( $datei ); # Datei schliessen
# Pattern-Suche
$verbose = undef if (not defined $option or $option ne 'alle');
while( /$pattern/g ) {
$var = $1;
print "$var, \n" if defined $verbose;
++$count;
}
print "\nletzter (von $count):\n$var\n";
__END__
Viele Grüße
Mirco
Re: if in while oder if vor while?
am 27.05.2006 18:48:13 von Chris Maanz
"Mirco Wahab" schrieb im Newsbeitrag
news:e59s6i$lm3$1@mlucom4.urz.uni-halle.de...
> Thus spoke Chris Maanz (on 2006-05-27 15:57):
>
>
> #!/usr/bin/perl
> use strict;
> use warnings;
>
> # initialization part
> my ($filename, $option) = (shift, shift);
> my $verbose = 1; # nimm erstmal 'alle' an
> my $us = 'Geschwindigkeit'; # ;-))
> my $pattern = qr/($us)/;
> my $var;
>
> # file operations
> open( my $datei, "<", $filename ) || die "error open: $!";
> $_ = do{ local $/, (<$datei>) };
> close( $datei );
>
> # pattern suche
> $verbose = undef if (not defined $option or $option ne 'alle');
> while( /$pattern/g ) {
> print "$1, \n" if defined $verbose;
> $var = $1;
> }
>
> print "letzter war: $var\n";
> __END__
>
> Viele Grüße
>
> Mirco
Interessante Variante ;-)
Allerdings verstehe ich die File-Operations Zeilen nicht, die Datei wird ja
schon wieder geschlossen,
bevor der Pattern gesucht wird.
Vor allem die Zeile
$_ = do{ local $/, (<$datei>) };
beeindruckt den Beginner ;-)
MfG,
Christian
Re: if in while oder if vor while?
am 27.05.2006 19:14:52 von Mirco Wahab
Thus spoke Chris Maanz (on 2006-05-27 18:48):
> Interessante Variante ;-)
> Allerdings verstehe ich die File-Operations Zeilen nicht, die Datei wird ja
> schon wieder geschlossen,
> bevor der Pattern gesucht wird.
Die Idee ist, das File
erst komplett einzulesen
(nach $text oder $_),
um dann alles mögliche
/im Speicher/ damit an-
stellen zu können.
Stell dir vor, Du willst
nicht nur _eine_ Suche machen ...
> Vor allem die Zeile
> $_ = do{ local $/, (<$datei>) };
> beeindruckt den Beginner ;-)
Das ist ein "Idiom", wie z.B. (ua.) von
U. Guttmann publiziert (http://perl.com/pub/a/2003/11/21/slurp.html):
...
Here is a Perl idiom that allows the $text
variable to be declared, and there is no
need for a tightly nested block. The do
block will execute in a scalar context
and slurp in the file named by $file:
open( FH, $file ) or die "sudden flaming death\n"
my $text = do { local( $/ ) ; } ;
...
Und da wir zwischen dem Einlesen und
dem Suchen nichts machen, das $_ mo-
difiziert, konnen wir das gleich be-
nutzen (und Kopiererei sparen).
Kommt Zeit, kommt Rat ...
Viele Grüße
Mirco