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');
43 prog => 'while (<>) { print $_; }',
46 is($x, "foo\n", '<> from just STDIN');
49 prog => 'while (<>) { print $ARGV.q/,/.$_ }',
50 args => [ 'Io_argv1.tmp', 'Io_argv2.tmp' ],
52 is($x, "Io_argv1.tmp,a line\nIo_argv2.tmp,another line\n", '$ARGV is the file name');
55 prog => 'print $ARGV while <>',
56 stdin => "foo\nbar\n",
59 is($x, "--", '$ARGV is - for explicit STDIN');
62 prog => 'print $ARGV while <>',
63 stdin => "foo\nbar\n",
65 is($x, "--", '$ARGV is - for implicit STDIN');
69 # 5.10 stopped autovivifying scalars in globs leading to a
70 # segfault when $ARGV is written to.
71 runperl( prog => 'eof()', stdin => "nothing\n" );
72 is( 0+$?, 0, q(eof() doesn't segfault) );
75 @ARGV = is_miniperl() ? ('Io_argv1.tmp', 'Io_argv1.tmp', 'Io_argv1.tmp')
76 : ('Io_argv1.tmp', 'Io_argv1.tmp', $devnull, 'Io_argv1.tmp');
80 is($., 3, '$. counts <>');
84 is($y, "1a line\n2a line\n3a line\n", '<> from @ARGV');
87 open(TRY, '>Io_argv1.tmp') or die "Can't open temp file: $!";
88 close TRY or die "Could not close: $!";
89 open(TRY, '>Io_argv2.tmp') or die "Can't open temp file: $!";
90 close TRY or die "Could not close: $!";
91 @ARGV = ('Io_argv1.tmp', 'Io_argv2.tmp');
92 $^I = '_bak'; # not .bak which confuses VMS
101 open(TRY, '<Io_argv1.tmp') or die "Can't open temp file: $!";
103 open(TRY, '<Io_argv2.tmp') or die "Can't open temp file: $!";
105 close TRY or die "Could not close: $!";
112 ok( eof NEVEROPENED, 'eof() true on unopened filehandle' );
115 open STDIN, 'Io_argv1.tmp' or die $!;
117 ok( !eof(), 'STDIN has something' );
122 skip_if_miniperl($no_devnull, 4);
123 open STDIN, $devnull or die $!;
125 ok( eof(), 'eof() true with empty @ARGV' );
127 @ARGV = ('Io_argv1.tmp');
130 @ARGV = ($devnull, $devnull);
133 close ARGV or die $!;
134 ok( eof(), 'eof() true after closing ARGV' );
139 open my $fh, 'Io_argv1.tmp' or die "Could not open Io_argv1.tmp: $!";
143 skip_if_miniperl($no_devnull, 5);
145 open $fh, $devnull or die;
146 ok( defined(<$fh>) );
151 open $fh, $devnull or die; # restart cycle again
152 ok( defined(<$fh>) );
154 close $fh or die "Could not close: $!";
157 open(TRY, '>Io_argv1.tmp') || (die "Can't open temp file: $!");
158 print TRY "one\n\nthree\n";
159 close TRY or die "Could not close: $!";
162 prog => 'print $..$ARGV.$_ while <<>>',
163 args => [ 'Io_argv1.tmp' ],
165 is($x, "1Io_argv1.tmpone\n2Io_argv1.tmp\n3Io_argv1.tmpthree\n", '<<>>');
168 prog => '$w=q/b/;$w.=<<>>;print $w',
169 args => [ 'Io_argv1.tmp' ],
171 is($x, "bone\n", '<<>> and rcatline');
174 prog => 'while (<<>>) { print }',
177 is($x, "foo\n", '<<>> from just STDIN (no argument)');
180 prog => 'print $ARGV.q/,/ for <<>>',
181 stdin => "foo\nbar\n",
183 is($x, "-,-,", '$ARGV is - for STDIN with <<>>');
186 prog => 'while (<<>>) { print $_; }',
191 like($x, qr/^Can't open -: .* at -e line 1/, '<<>> does not treat - as STDIN');
194 # tests for an empty string in @ARGV
196 prog => 'push @ARGV,q//;print while <>',
199 like($x, qr/^Can't open : .* at -e line 1/, '<<>> does not treat - as STDIN');
202 prog => 'push @ARGV,q//;print while <<>>',
205 like($x, qr/^Can't open : .* at -e line 1/, '<<>> does not treat - as STDIN');
209 skip('no echo', 2) unless -x '/bin/echo';
212 prog => 'while (<<>>) { print $_; }',
214 args => [ '"echo foo |"' ],
216 like($x, qr/^Can't open echo foo \|: .* at -e line 1/, '<<>> does not treat ...| as fork');
219 prog => 'while (<<>>) { }',
221 args => [ 'Io_argv1.tmp', '"echo foo |"' ],
223 like($x, qr/^Can't open echo foo \|: .* at -e line 1, <> line 3/, '<<>> does not treat ...| as fork after eof');
226 # This used to dump core
227 fresh_perl_is( <<'**PROG**', "foobar", {}, "ARGV aliasing and eof()" );
228 open OUT, ">Io_argv3.tmp" or die "Can't open temp file: $!";
231 open IN, "Io_argv3.tmp" or die "Can't open temp file: $!";
235 print "bar" if eof();
238 unlink "Io_argv3.tmp";
241 # This used to fail an assertion.
242 # The tricks with *x and $x are to make PL_argvgv point to a freed SV when
243 # the readline op does SvREFCNT_inc on it. undef *x clears the scalar slot
244 # ++$x vivifies it, reusing the just-deleted GV that PL_argvgv still points
245 # to. The BEGIN block ensures it is freed late enough that nothing else
247 is runperl(prog => 'undef *x; delete $::{ARGV}; $x++;'
248 .'eval q-BEGIN{undef *x} readline-; print qq-ok\n-'),
249 "ok\n", 'deleting $::{ARGV}';
252 unlink_all 'Io_argv1.tmp', 'Io_argv1.tmp_bak',
253 'Io_argv2.tmp', 'Io_argv2.tmp_bak', 'Io_argv3.tmp';