in reply to New Line at End File

If you don't want to read the whole file into memory you can just truncate it in place....

[tachyon@www cgi-bin]# cat ./test.pl #!/usr/bin/perl my $file = '/tmp/test.txt'; open FILE, ">$file" or die $!; print FILE "foo\nbar\nfoo\nbar\nfoo\nbar\nfoo\nbar\nfoo\nbar\nfoo\nbar +\n\n\r\n\n\r"; close FILE; # grab the last 20 bytes for analysis open FILE, $file or die $!; { local $/ = undef; seek FILE, -20, 2; $EOF = <FILE>; } close FILE; my $file_length = -s $file; (my $newlines) = $EOF =~ m/([\015\012]+)\z/; my $num_newlines = length $newlines; print "File length $file_length bytes, number of newlines $num_newline +s\n"; truncate $file, ($file_length - $num_newlines) or die $!; print "Now file is ", -s $file, "bytes\n\n"; [tachyon@www cgi-bin]# ./test.pl File length 53 bytes, number of newlines 6 Now file is 47 bytes [tachyon@www cgi-bin]#

cheers

tachyon

s&&rsenoyhcatreve&&&s&n.+t&"$'$`$\"$\&"&ee&&y&srve&&d&&print

Replies are listed 'Best First'.
Re: Re: New Line at End File
by jmcnamara (Monsignor) on Dec 10, 2002 at 11:20 UTC

    You should have pointed out that this solution will only work if there are 20 or less newlines at the end of the file.

    --
    John.

      but that would have left nothing left to say.... I would generally read in 512 bytes anyway as this is a generally a sector and realistically the smallest chunk of a disk that the OS ever reads. This was an example and the limitation is self evident I would have thought. As it happens it will only take of the last 10 'newline' CRLF line endings on Windows if we want to get really picky ;-)

      If you want to move on to the more arcane and esoteric neither seek() nor read() for that matter can be relied upon to do exactly what you ask. From the docs....

      If you want to position file for sysread or syswrite, don't use seek-- +buffering makes its effect on the file's system position unpredictabl +e and non-portable. Use sysseek instead.

      cheers

      tachyon

      s&&rsenoyhcatreve&&&s&n.+t&"$'$`$\"$\&"&ee&&y&srve&&d&&print