Thank you Ronald. Your explanations bring much clarification. On Thu, 6 Feb 2003 10:00:16 -0500, Ronald J Kimball wrote:
> An eof without an argument uses the last file read as argument. >You have not read from any files at this point in your script, so calling >eof without an argument is not useful. Perhaps you meant to call eof(IN) >instead. Quite right. I thought opening the file was enough. Indeed, eof(IN) is the correct thing. >perldoc -f eof: >And perldoc -f read: Where did you get this ? I have tried on a unix server; it doesn't know the perldoc command. Where is it located ? >So, you could write your loop like this instead: >while ($p = read IN, $_, $n) { > $k++; >} When exiting this loop, $p is always zero. >or perhaps: >while ($p = read(IN, $_, $n) and $p == $n) { > $k++; >} This one exits with $p = number of bytes actually read. >But, instead of read(), you can actually read blocks with <>, by setting $/ > to a reference to an integer: >$/ = \100000; >while (<IN>) { > $k++; >} That's neat. I didn't know of this feature. I tried it several times, but unfortunately, I got "out of memory" on each run. More disturbing is the fact that it happened as well with values of 10000 and 1000. The file is 3509313 bytes, bigger than my MacPerl can swallow. However, I had no trouble with 100000 byte blocks and the "read" command. I even tried 1M blocks without harm. Does this mean that the reading or buffering process is quite different when using <> ? Or is it MacPerl 5.20r4, which I'm still using ? Best regards As an update, the trial script is now: #!/usr/local/bin/perl -w $\="\n"; my ($k,$p) = (0,0); my $n = 100000; open IN, '<truc' or die 'truc not open'; print 'file info: ', -s 'truc',' chars'; # 3509313 $/=\$n; while (<IN>) {$p = length; $k++}; # out of memory print "p: $p"; print "$k blocks: ",($k-1)*$n+$p,' chars'; # 36 3509313 __END__ file info: 3509313 chars Out of memory! =====