eof (any form) performs a read if there's nothing in the handle's buffer. If you're at the end of the last file in @ARGV during a read of ARGV, ARGV moves on to the next file. The file to which you want to add is now closed.
Based on black box testing, reading from ARGV (include when done via eof()) under -i is pretty close to
#XXX Doesn't handle empty @ARGV sub fill_argv { if (!eof(ARGV)) { return 1; } while (@ARGV) { $ARGV = shift(@ARGV); if (!open(ARGV, '<', $ARGV)) { warn("Can't open $ARGV: $!"); next; } if (!unlink($ARGV)) { warn("Can't remove $ARGV: $!, skipping file.\n"); next; } if (!open(ARGVOUT, '>', $ARGV)) { warn(???); next; } select(ARGVOUT); return 1; } $ARGV = undef; close(ARGVOUT); select(STDOUT); return 1; }
OT trivia: Note how it always returns success since it always handles errors itself.
Update: Added expansion of reading from ARGV under -i. And then did some tweaks.
In reply to Re: perl -i -pe ... with eof() testing
by ikegami
in thread perl -i -pe ... with eof() testing
by Anonyrnous Monk
| For: | Use: | ||
| & | & | ||
| < | < | ||
| > | > | ||
| [ | [ | ||
| ] | ] |