Thread welchen Programmierstil findet ihr lesbarer? (13 answers)
Opened by lichtkind at 2010-08-10 20:43

topeg
 2010-08-11 00:11
#140528 #140528
User since
2006-07-10
2611 Artikel
BenutzerIn

user image
Das Problem bei beiden Code-Beispielen ist, dass sie nicht immer funktionieren. Man stelle sich eine Mac-kodierte Datei mit mehreren leeren Zeilen vor:

Code: (dl )
1
2
3
4
das ist ein Test\r
\r
\r
Noch etwas Text\r

Beide Codes würden hier durch einander kommen.

weiterhin hat der zweite Code ein Problem in der Bedingung wann ein "$eol" geschrieben werden soll:
Code (perl): (dl )
1
2
3
4
unless $last eq "\r" and $ch eq "\n";
if !($last eq "\r" and $ch eq "\n");
if !($last eq "\r") or !($ch eq "\n");
if $last ne "\r" or $ch ne "\n"

Das kann wohl so nicht stimmen oder?

Nicht zu vergessen das unter Windows (je nach dem wie perl kompiliert wurde) \n auch \x0D\x0A sein kann.

Also mein Vorschlag (ungetestet):
Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
use strict;
use warnings;

my %eols=(
  unix  => "\x0A",
  linux => "\x0A",
  dos   => "\x0D\x0A",
  win   => "\x0D\x0A",
  mac   => "\x0D",
  apple => "\x0D",
);

sub usage ()
{
  print STDERR "Usage $0 ".join('|', sort keys %eols)."\n";
  exit(8);
}

sub determin_eol($$)
{
  my ($last,$ch)=@_;
  my $write='';
  # Win Ending
  if($last eq "\x0D" && $ch eq "\x0A")
  {
    $write=$eol;
    $last='';
  }
  # Mac Ending
  elsif($last eq "\x0D")
  {
    $write=$eol;
    $last=$ch;
  }
  # UNX Ending
  elsif($last eq "\x0A")
  {
    $write=$eol;
    $last=$ch;
  }
  # no ending found
  else
  {
    $write=$last;
    $last=$ch;
  }
  return ($write,$last);
}

binmode(STDIN);
binmode(STDOUT);

usage() unless (@ARGV && $eols{$ARGV[0]});

my $eol=$eols{$ARGV[0]};
my $ch;
my $last='';
while (sysread(STDIN, $ch, 1) > 0)
{
  my $write='';
  ($write,$last)=determin_eol($last,$ch);
  syswrite(STDOUT, $write);
}
# write last char.
syswrite(STDOUT, join('',determin_eol($last,'')));


Wobei das auch noch nicht immer funktioniert, da unter jedem System "\r" und "\n" beliebig gemischt vorkommen können, je nach dem was dargestellt werden soll.

View full thread welchen Programmierstil findet ihr lesbarer?