in reply to Determine whether file is dos or unix format

Hello all,

I have tried the first solution posted, which was similar to what

my ($input_root) = ($input_file =~ /([^\\\/]+)\.\w+$/); open(IN, "<$input_file") or die "Couldn't open file: $!: $input_f +ile"; while(<IN>) { if (/\r\n/) { die "DOS files not allowed" } $total_lines++; }

When I run a DOS file through this code it does not "die" on me. See the problem is that I built a validation program that validates UNIX text files. Sometimes when people hand-edit the file they save it in a DOS format via UltraEdit. We don't find out that we sent a DOS file until our Vendor tries to ingest it, which is a pain in the butt.

That is my situation and code. Any help would be appreciated. I spot check files by hand and do convert them to UNIX via perl, but I want really to return an error that stop validation so the user will fix the file to UNIX.

Thanks,
fritzvtb

Edited by GrandFather to fix formatting

Replies are listed 'Best First'.
Re^2: Determine whether file is dos or unix format
by ikegami (Patriarch) on Nov 28, 2005 at 21:58 UTC

    Please use <c>...</c> around your code.

    On which OS will your run your code?

    • On the Mac, \r is LF and \n is CR, so don't use \r and \n.
    • On the Mac, the line is ended by CR, so checking for CRLF on a line basis won't work
    • On Windows, you need to use binmode. CRLF becomes LF when a file is read without binmode.
    • On unix, what you have should work.

    Fix:

    # Works on unix. # Works on Windows. # Still doesn't work on Mac. open(IN, '<', $input_file) or die "Couldn't open file $input_file: $!\n"; binmode(IN); while (<IN>) { if (/\x0D\x0A/) { die("DOS files not allowed\n"); } $total_lines++; }

    Update: Here's something that works everywhere:

    # Works on unix. # Works on Windows. # Works on Mac. { open(my $fh, '<', $input_file) or die "Couldn't open file $input_file: $!\n"; binmode($fh); my $buf = ''; while (read($fh, $buf, 1024, length($buf))) { if (/\x0D\x0A/) { die("DOS files not allowed\n"); } $buf = substr($buf, -1); } } { open(my $fh, '<', $input_file) or die "Couldn't open file $input_file: $!\n"; while (<$fh>) { $total_lines++; } }