1#!./perl 2 3BEGIN { 4 chdir 't' if -d 't'; 5 @INC = '../lib'; 6} 7 8BEGIN { require "./test.pl"; } 9 10plan(tests => 23); 11 12use File::Spec; 13 14my $devnull = File::Spec->devnull; 15 16open(TRY, '>Io_argv1.tmp') || (die "Can't open temp file: $!"); 17print TRY "a line\n"; 18close TRY or die "Could not close: $!"; 19 20$x = runperl( 21 prog => 'while (<>) { print $., $_; }', 22 args => [ 'Io_argv1.tmp', 'Io_argv1.tmp' ], 23); 24is($x, "1a line\n2a line\n", '<> from two files'); 25 26{ 27 $x = runperl( 28 prog => 'while (<>) { print $_; }', 29 stdin => "foo\n", 30 args => [ 'Io_argv1.tmp', '-' ], 31 ); 32 is($x, "a line\nfoo\n", ' from a file and STDIN'); 33 34 $x = runperl( 35 prog => 'while (<>) { print $_; }', 36 stdin => "foo\n", 37 ); 38 is($x, "foo\n", ' from just STDIN'); 39} 40 41{ 42 # 5.10 stopped autovivifying scalars in globs leading to a 43 # segfault when $ARGV is written to. 44 runperl( prog => 'eof()', stdin => "nothing\n" ); 45 is( 0+$?, 0, q(eof() doesn't segfault) ); 46} 47 48@ARGV = ('Io_argv1.tmp', 'Io_argv1.tmp', $devnull, 'Io_argv1.tmp'); 49while (<>) { 50 $y .= $. . $_; 51 if (eof()) { 52 is($., 3, '$. counts <>'); 53 } 54} 55 56is($y, "1a line\n2a line\n3a line\n", '<> from @ARGV'); 57 58 59open(TRY, '>Io_argv1.tmp') or die "Can't open temp file: $!"; 60close TRY or die "Could not close: $!"; 61open(TRY, '>Io_argv2.tmp') or die "Can't open temp file: $!"; 62close TRY or die "Could not close: $!"; 63@ARGV = ('Io_argv1.tmp', 'Io_argv2.tmp'); 64$^I = '_bak'; # not .bak which confuses VMS 65$/ = undef; 66my $i = 7; 67while (<>) { 68 s/^/ok $i\n/; 69 ++$i; 70 print; 71 next_test(); 72} 73open(TRY, '<Io_argv1.tmp') or die "Can't open temp file: $!"; 74print while <TRY>; 75open(TRY, '<Io_argv2.tmp') or die "Can't open temp file: $!"; 76print while <TRY>; 77close TRY or die "Could not close: $!"; 78undef $^I; 79 80ok( eof TRY ); 81 82{ 83 no warnings 'once'; 84 ok( eof NEVEROPENED, 'eof() true on unopened filehandle' ); 85} 86 87open STDIN, 'Io_argv1.tmp' or die $!; 88@ARGV = (); 89ok( !eof(), 'STDIN has something' ); 90 91is( <>, "ok 7\n" ); 92 93open STDIN, $devnull or die $!; 94@ARGV = (); 95ok( eof(), 'eof() true with empty @ARGV' ); 96 97@ARGV = ('Io_argv1.tmp'); 98ok( !eof() ); 99 100@ARGV = ($devnull, $devnull); 101ok( !eof() ); 102 103close ARGV or die $!; 104ok( eof(), 'eof() true after closing ARGV' ); 105 106{ 107 local $/; 108 open F, 'Io_argv1.tmp' or die "Could not open Io_argv1.tmp: $!"; 109 <F>; # set $. = 1 110 is( <F>, undef ); 111 112 open F, $devnull or die; 113 ok( defined(<F>) ); 114 115 is( <F>, undef ); 116 is( <F>, undef ); 117 118 open F, $devnull or die; # restart cycle again 119 ok( defined(<F>) ); 120 is( <F>, undef ); 121 close F or die "Could not close: $!"; 122} 123 124# This used to dump core 125fresh_perl_is( <<'**PROG**', "foobar", {}, "ARGV aliasing and eof()" ); 126open OUT, ">Io_argv3.tmp" or die "Can't open temp file: $!"; 127print OUT "foo"; 128close OUT; 129open IN, "Io_argv3.tmp" or die "Can't open temp file: $!"; 130*ARGV = *IN; 131while (<>) { 132 print; 133 print "bar" if eof(); 134} 135close IN; 136unlink "Io_argv3.tmp"; 137**PROG** 138 139END { 140 1 while unlink 'Io_argv1.tmp', 'Io_argv1.tmp_bak', 141 'Io_argv2.tmp', 'Io_argv2.tmp_bak', 'Io_argv3.tmp'; 142} 143