Schrift
[thread]8478[/thread]

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

Leser: 6


<< |< 1 2 3 >| >> 25 Einträge, 3 Seiten
bloonix
 2006-11-07 17:22
#71489 #71489
User since
2005-12-17
1615 Artikel
HausmeisterIn
[Homepage]
user image
[quote=renee,06.11.2006, 15:04]
Code: (dl )
1
2
3
while(<$fh>){
   if(/START/ .. /ENDE/){
       push(@lines,$_);
[/quote]

Verbesserungsvorschlag:

Code: (dl )
1
2
3
while(defined (my $line = <$fh>)){
  if($line =~ /START/ .. $line =~ /ENDE/){
      push(@lines,$line);
What is a good module? That's hard to say.
What is good code? That's also hard to say.
One man's Thing of Beauty is another's man's Evil Hack.
docsnyder
 2006-11-07 17:51
#71490 #71490
User since
2005-09-08
300 Artikel
BenutzerIn
[Homepage] [default_avatar]
Was soll daran besser sein???
Taulmarill
 2006-11-07 18:10
#71491 #71491
User since
2004-02-19
1750 Artikel
BenutzerIn

user image
more verbose, less perlish

sorry opi, aber das ist wohl weniger eine frage von gut oder schlecht, sondern mehr eine des geschmacks. ich würde sogar zu folgendem tendieren
Code: (dl )
while ( <$fh> ) { push @lines, $_ if /START/ .. /END/ }


und das hier gefällt mir sogar noch besser
Code: (dl )
my @lines = grep { /START/ .. /END/ } <$fh>;
\n\n

<!--EDIT|Taulmarill|1162915949-->
$_=unpack"B*",~pack"H*",$_ and y&1|0& |#&&print"$_\n"for@.=qw BFA2F7C39139F45F78
0A28104594444504400 0A2F107D54447DE7800 0A2110453444450500 73CF1045138445F4800 0
F3EF2044E3D17DE 8A08A0451412411 F3CF207DF41C79E 820A20451412414 83E93C4513D17D2B
bloonix
 2006-11-07 18:14
#71492 #71492
User since
2005-12-17
1615 Artikel
HausmeisterIn
[Homepage]
user image
Ich glaube nicht, dass hier alles in @lines wandert, was reingehört:

Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
my @lines;
open my $fh,'<',$file or die $!;
while(<$fh>){
  if(/START/ .. /ENDE/){
      foo();
      push(@lines,$_);
  }
}
close $fh;

print $_ for @lines;

sub foo {
  open my $fh, '<',$otherfile or die $!;
  while (<$fh>) {
     # operations
  }
  close $fh;
}


Oder aber Ihr prüft vorher jedes Modul, ob es $_ sauber lokalisiert.\n\n

<!--EDIT|opi|1162916141-->
What is a good module? That's hard to say.
What is good code? That's also hard to say.
One man's Thing of Beauty is another's man's Evil Hack.
renee
 2006-11-07 18:16
#71493 #71493
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Wir hatten hier schonmal die Problematik angesprochen, dass $_ durch die while-Schleife überschrieben (weil nicht lokalisiert) wird.

@opi: das defined brauchst Du nicht. Das macht Perl automatisch...
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/
renee
 2006-11-07 18:17
#71494 #71494
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
[quote=Taulmarill,07.11.2006, 17:10]more verbose, less perlish

sorry opi, aber das ist wohl weniger eine frage von gut oder schlecht, [...][/quote]
Naja, siehe Antworten von opi und mir
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/
betterworld
 2006-11-08 00:29
#71495 #71495
User since
2003-08-21
2614 Artikel
ModeratorIn

user image
[quote=renee,07.11.2006, 17:16]@opi: das defined brauchst Du nicht. Das macht Perl automatisch...[/quote]
Meinst Du dieses defined?
Code: (dl )
while(defined (my $line = <$fh>)){


Das braucht man. Allerdings ist der einzige Fall, wo der Unterschied relevant wird, eine Datei, deren letzte Zeichen "\n0" sind.

Wenn man hingegen while (<$fh>) schreibt, macht Perl in der Tat das defined automatisch. In dem Fall sollte man irgendwo local($_) oder gar local(*_) schreiben, wie wir in dem von Dir schon angesprochenen Thread ja mal besprochen haben.
pq
 2006-11-08 00:37
#71496 #71496
User since
2003-08-04
12209 Artikel
Admin1
[Homepage]
user image
[quote=betterworld,07.11.2006, 23:29]Meinst Du dieses defined?
Code: (dl )
while(defined (my $line = <$fh>)){


Das braucht man.[/quote]
Code: (dl )
1
2
3
4
5
6
7
8
9
10
perl -MO=Deparse -wle'
while (my $line = <>) {
print $line
}'
BEGIN { $^W = 1; }
BEGIN { $/ = "\n"; $\ = "\n"; }
while (defined(my $line = <ARGV>)) {
   print $line;
}
-e syntax OK
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
betterworld
 2006-11-08 00:39
#71497 #71497
User since
2003-08-21
2614 Artikel
ModeratorIn

user image
Jetzt bin ich total verwirrt, aber pq und renee haben offenbar recht und ich habe Muell geschrieben.
Taulmarill
 2006-11-08 11:48
#71498 #71498
User since
2004-02-19
1750 Artikel
BenutzerIn

user image
ich hab noch ne schöne möglichkeit gefunden, wenn man nur die zeilen ausserhalb der markierung haben will (brauchte das gerade)
Code: (dl )
while ( <DATA> ) { /START/ .. /END/ or push @lines, $_ }

aber irgendwie scheue ich mich davor, so was in einem program zu verwenden, dass ich auch maintainen muss.\n\n

<!--EDIT|Taulmarill|1162979696-->
$_=unpack"B*",~pack"H*",$_ and y&1|0& |#&&print"$_\n"for@.=qw BFA2F7C39139F45F78
0A28104594444504400 0A2F107D54447DE7800 0A2110453444450500 73CF1045138445F4800 0
F3EF2044E3D17DE 8A08A0451412411 F3CF207DF41C79E 820A20451412414 83E93C4513D17D2B
<< |< 1 2 3 >| >> 25 Einträge, 3 Seiten



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