[quote=Strat,12.01.2006, 12:53]
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
my (@newLine) = &AnalyzeFileEol($infile);
my $newLine = join("", map { chr(hex($_)) } @newline;
local $/ = $newLine;
# ------------------------------------------------------------
sub AnalyzeFileEol {
my ($file) = shift;
my $eol = chr(10);
unless (open (FH, "<", $file)) {
die "Error: couldn't read file '$file': $!\n";
} # unless
my @chars = ();
while (defined (my $chr = getc(FH))) {
my $hex = sprintf("%02X", ord($chr));
if ($hex eq '0D') {
[...]
[/quote]
Sorry, strat, aber der Code tut nicht das, was er soll. Du liest die Datei nicht mit binmode(), deshalb wird dir fuer eine Datei mit CRLF-Zeilenumbruechen unter DOS/Windows ausgegeben, dass sie Unix-Format haette. Und die Umwandlung von jedem eingelesenen Char in eine Hexdarstellung, um dann einen Stringvergleich durchzufuehren, halte ich auch nicht fuer sehr effizient. (Und da sind noch zwei Syntaxfehler in den ersten beiden Zeilen.)
Ich hab's hier mal etwas ueberarbeitet:
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
#!/usr/bin/perl
use strict;
use warnings;
my $filename = shift;
{
local $/ = LineSeparator($filename);
# mach was mit der Datei
}
exit 0;
############################################################
sub LineSeparator {
my ($file) = @_;
open (my $infile_h, '<', $file) or die "could not open '$file' for reading: $!";
binmode $infile_h;
my $eol = '';
my $format = 'unknown';
while (defined (my $chr = ord getc($infile_h))) {
if ($chr == 0x0D) {
$chr = ord getc($infile_h);
if ($chr == 0x0A) {
$format = 'DOS';
$eol = "\x0D\x0A";
} else {
$format = 'MacOS 9 or earlier';
$eol = "\x0D";
}
last;
} elsif ($chr == 0x0A) {
$format = 'UNIX';
$eol = "\x0A";
last;
}
}
close $infile_h;
print STDERR "Line terminator format: $format\n";
return $eol;
}
Generell hat dieser Ansatz noch den Nachteil, dass das erstbeste Vorkommen von einem CR oder NL ueber das Dateiformat entscheidet. Man koennte vielleicht eine etwas vorsichtigere Heuristik anwenden, die die Haeufigkeit der verschiedenen Zeichen oder Zeichenkombinationen auswertet.