Schrift
[thread]8478[/thread]

Datei einlesen von "START" bis "ENDE" (Seite 3)

Leser: 6


<< |< 1 2 3 >| >> 25 Einträge, 3 Seiten
renee
 2006-11-08 12:14
#71499 #71499
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Warum? Wenn man den Flip-Flop-Operator kennt, dann ist das (meiner Meinung nach) sogar besser lesbar als wenn man selbst irgendwelche Flags setzt und dann mehrere if-Abfragen hat. Hier ist der gewünschte Bereich auf einen Blick ersichtlich.
OTRS-Erweiterungen (http://feature-addons.de/)
Frankfurt Perlmongers (http://frankfurt.pm/)
--

Unterlagen OTRS-Workshop 2012: http://otrs.perl-services.de/workshop.html
Perl-Entwicklung: http://perl-services.de/
Duff
 2006-11-08 12:15
#71500 #71500
User since
2006-10-06
283 Artikel
BenutzerIn

user image
Code: (dl )
1
2
3
4
5
6
7
8
9
10
my @lines;
open my $fh,'<',$file or die $!;
while(<$fh>){
if(/START/ .. /ENDE/){
push(@lines,$_);
}
}
close $fh;

print $_ for @lines;


Also ich finde diese Lösung von renee eigentlich noch am besten, da sie auch sehr übersichtlich ist (im Vergleich zu so einem Einzeiler).\n\n

<!--EDIT|Duff|1162980994-->
D'OH
Daniel
Taulmarill
 2006-11-08 12:31
#71501 #71501
User since
2004-02-19
1750 Artikel
BenutzerIn

user image
das kommt nun einmal darauf an. wenn ich eine schleife in eine terminal-zeile schreiben kann (80 zeichen) dann tue ich das auch meistens. imho sind subroutinen, die man auf einen blick einsehen kann einfach schneller zu verstehen, als solche, die sich über mehrere bildschirme erstrecken. daher bin ich bemüht kompakten aber trotzdem verständlichen code zu schreiben.

zu der sache mit dem $_ währe noch anzumerken, dass man bei längeren while oder for schleifen sicher eine eigene variable daklarieren sollte. solange das aber noch sehr übersichtlich ist (was es meiner meinung war), ist das aber imho nicht nötig.

ob man
Code: (dl )
1
2
3
4
5
while(<$fh>){
if(/START/ .. /ENDE/){
push(@lines,$_);
}
}

oder
Code: (dl )
while(<$fh>){ push(@lines,$_) if /START/ .. /ENDE/) }

oder gar
Code: (dl )
/START/ .. /END/ and push @lines, $_ while <DATA>;

übersichtlicher findet, hat mit sicherheit neben den persönlichen vorlieben auch noch was damit zu tun, wie viel man mit Perl macht und ob man daneben auch noch viel in einer anderen sprache programmiert.
$_=unpack"B*",~pack"H*",$_ and y&1|0& |#&&print"$_\n"for@.=qw BFA2F7C39139F45F78
0A28104594444504400 0A2F107D54447DE7800 0A2110453444450500 73CF1045138445F4800 0
F3EF2044E3D17DE 8A08A0451412411 F3CF207DF41C79E 820A20451412414 83E93C4513D17D2B
Crian
 2006-11-10 14:09
#71502 #71502
User since
2003-08-04
5875 Artikel
ModeratorIn
[Homepage]
user image
[quote=Taulmarill,07.11.2006, 17:10]
Code: (dl )
my @lines = grep { /START/ .. /END/ } <$fh>;
[/quote]
Das finde ich nicht so schön, angenommen die Datei ist sehr groß und der Abschnitt klein, muss hierbei trotzdem die ganze Datei im Speicher behalten werde, oder irre ich mich?

Ich tendiere zu

Code: (dl )
1
2
3
while (<$fh>) {
push(@lines, $_) if /START/ .. /ENDE/;
}
\n\n

<!--EDIT|Crian|1163160666-->
s--Pevna-;s.([a-z]).chr((ord($1)-84)%26+97).gee; s^([A-Z])^chr((ord($1)-52)%26+65)^gee;print;

use strict; use warnings; Link zu meiner Perlseite
pq
 2006-11-10 17:09
#71503 #71503
User since
2003-08-04
12209 Artikel
Admin1
[Homepage]
user image
[quote=Crian,10.11.2006, 13:09]Das finde ich nicht so schön, angenommen die Datei ist sehr groß und der Abschnitt klein, muss hierbei trotzdem die ganze Datei im Speicher behalten werde, oder irre ich mich?[/quote]
richtig.
was dann auch nicht mehr klappt, ist das matchen der zeilennummer.
nehmen wir an, ich will alles zwischen zeile 2 und der zeile "END";
dann wuerde
grep { 2 .. /END/ } <$fh>;
nicht richtig funktionieren, da innerhalb des grep-blocks die zeilennummer
schon die letzte zeile von $fh ist.
Always code as if the guy who ends up maintaining your code will be a violent psychopath who knows where you live. -- Damian Conway in "Perl Best Practices"
lesen: Wiki:Wie frage ich & perlintro Wiki:brian's Leitfaden für jedes Perl-Problem
<< |< 1 2 3 >| >> 25 Einträge, 3 Seiten



View all threads created 2006-11-06 15:56.