8 BEGIN { require "./test.pl"; }
12 my ($devnull, $no_devnull);
15 $no_devnull = "no dynamic loading on miniperl, File::Spec not built, so can't determine /dev/null";
18 $devnull = File::Spec->devnull;
21 open(TRY, '>Io_argv1.tmp') || (die "Can't open temp file: $!");
23 close TRY or die "Could not close: $!";
24 open(TRY, '>Io_argv2.tmp') || (die "Can't open temp file: $!");
25 print TRY "another line\n";
26 close TRY or die "Could not close: $!";
29 prog => 'while (<>) { print $., $_; }',
30 args => [ 'Io_argv1.tmp', 'Io_argv1.tmp' ],
32 is($x, "1a line\n2a line\n", '<> from two files');
36 prog => 'while (<>) { print $_; }',
38 args => [ 'Io_argv1.tmp', '-' ],
40 is($x, "a line\nfoo\n", '<> from a file and STDIN');
42 # readline should behave as <>, not <<>>
44 prog => 'while (readline) { print $_; }',
49 is($x, "foo\n", 'readline() from STDIN');
52 prog => 'while (<>) { print $_; }',
55 is($x, "foo\n", '<> from just STDIN');
58 prog => 'while (<>) { print $ARGV.q/,/.$_ }',
59 args => [ 'Io_argv1.tmp', 'Io_argv2.tmp' ],
61 is($x, "Io_argv1.tmp,a line\nIo_argv2.tmp,another line\n", '$ARGV is the file name');
64 prog => 'print $ARGV while <>',
65 stdin => "foo\nbar\n",
68 is($x, "--", '$ARGV is - for explicit STDIN');
71 prog => 'print $ARGV while <>',
72 stdin => "foo\nbar\n",
74 is($x, "--", '$ARGV is - for implicit STDIN');
78 # 5.10 stopped autovivifying scalars in globs leading to a
79 # segfault when $ARGV is written to.
80 runperl( prog => 'eof()', stdin => "nothing\n" );
81 is( 0+$?, 0, q(eof() doesn't segfault) );
84 @ARGV = is_miniperl() ? ('Io_argv1.tmp', 'Io_argv1.tmp', 'Io_argv1.tmp')
85 : ('Io_argv1.tmp', 'Io_argv1.tmp', $devnull, 'Io_argv1.tmp');
89 is($., 3, '$. counts <>');
93 is($y, "1a line\n2a line\n3a line\n", '<> from @ARGV');
96 open(TRY, '>Io_argv1.tmp') or die "Can't open temp file: $!";
97 close TRY or die "Could not close: $!";
98 open(TRY, '>Io_argv2.tmp') or die "Can't open temp file: $!";
99 close TRY or die "Could not close: $!";
100 @ARGV = ('Io_argv1.tmp', 'Io_argv2.tmp');
101 $^I = '_bak'; # not .bak which confuses VMS
110 open(TRY, '<Io_argv1.tmp') or die "Can't open temp file: $!";
112 open(TRY, '<Io_argv2.tmp') or die "Can't open temp file: $!";
114 close TRY or die "Could not close: $!";
121 ok( eof NEVEROPENED, 'eof() true on unopened filehandle' );
124 open STDIN, 'Io_argv1.tmp' or die $!;
126 ok( !eof(), 'STDIN has something' );
131 skip_if_miniperl($no_devnull, 4);
132 open STDIN, $devnull or die $!;
134 ok( eof(), 'eof() true with empty @ARGV' );
136 @ARGV = ('Io_argv1.tmp');
139 @ARGV = ($devnull, $devnull);
142 close ARGV or die $!;
143 ok( eof(), 'eof() true after closing ARGV' );
148 open my $fh, 'Io_argv1.tmp' or die "Could not open Io_argv1.tmp: $!";
152 skip_if_miniperl($no_devnull, 5);
154 open $fh, $devnull or die;
155 ok( defined(<$fh>) );
160 open $fh, $devnull or die; # restart cycle again
161 ok( defined(<$fh>) );
163 close $fh or die "Could not close: $!";
166 open(TRY, '>Io_argv1.tmp') || (die "Can't open temp file: $!");
167 print TRY "one\n\nthree\n";
168 close TRY or die "Could not close: $!";
171 prog => 'print $..$ARGV.$_ while <<>>',
172 args => [ 'Io_argv1.tmp' ],
174 is($x, "1Io_argv1.tmpone\n2Io_argv1.tmp\n3Io_argv1.tmpthree\n", '<<>>');
177 prog => '$w=q/b/;$w.=<<>>;print $w',
178 args => [ 'Io_argv1.tmp' ],
180 is($x, "bone\n", '<<>> and rcatline');
183 prog => 'while (<<>>) { print }',
186 is($x, "foo\n", '<<>> from just STDIN (no argument)');
189 prog => 'print $ARGV.q/,/ for <<>>',
190 stdin => "foo\nbar\n",
192 is($x, "-,-,", '$ARGV is - for STDIN with <<>>');
195 prog => 'while (<<>>) { print $_; }',
200 like($x, qr/^Can't open -: .* at -e line 1/, '<<>> does not treat - as STDIN');
203 # tests for an empty string in @ARGV
205 prog => 'push @ARGV,q//;print while <>',
208 like($x, qr/^Can't open : .* at -e line 1/, '<> does not open empty string in ARGV');
211 prog => 'push @ARGV,q//;print while <<>>',
214 like($x, qr/^Can't open : .* at -e line 1/, '<<>> does not open empty string in ARGV');
218 skip('no echo', 2) unless -x '/bin/echo';
221 prog => 'while (<<>>) { print $_; }',
223 args => [ '"echo foo |"' ],
225 like($x, qr/^Can't open echo foo \|: .* at -e line 1/, '<<>> does not treat ...| as fork');
228 prog => 'while (<<>>) { }',
230 args => [ 'Io_argv1.tmp', '"echo foo |"' ],
232 like($x, qr/^Can't open echo foo \|: .* at -e line 1, <> line 3/, '<<>> does not treat ...| as fork after eof');
235 # This used to dump core
236 fresh_perl_is( <<'**PROG**', "foobar", {}, "ARGV aliasing and eof()" );
237 open OUT, ">Io_argv3.tmp" or die "Can't open temp file: $!";
240 open IN, "Io_argv3.tmp" or die "Can't open temp file: $!";
244 print "bar" if eof();
247 unlink "Io_argv3.tmp";
250 # This used to fail an assertion.
251 # The tricks with *x and $x are to make PL_argvgv point to a freed SV when
252 # the readline op does SvREFCNT_inc on it. undef *x clears the scalar slot
253 # ++$x vivifies it, reusing the just-deleted GV that PL_argvgv still points
254 # to. The BEGIN block ensures it is freed late enough that nothing else
256 is runperl(prog => 'undef *x; delete $::{ARGV}; $x++;'
257 .'eval q-BEGIN{undef *x} readline-; print qq-ok\n-'),
258 "ok\n", 'deleting $::{ARGV}';
261 unlink_all 'Io_argv1.tmp', 'Io_argv1.tmp_bak',
262 'Io_argv2.tmp', 'Io_argv2.tmp_bak', 'Io_argv3.tmp';