use strict; use warnings FATAL => 'all'; my @open = ( q(open( my $fh, @_ )), q(open( my $fh, @_[ 0..$#_ ] )), q(open( my $fh, shift, @_ )), ); my $filename = 'hello_world'; my $test_string = "Hello, world!\n"; for my $prepare ( \&remove, \&truncate ) { for my $o ( @open ) { my $sub = eval "sub { $o or die \$!; return \$fh }" or die 'eval failed'; $prepare->( $filename ); # remove or truncate eval { my $fh = $sub->( '>', $filename ); print $fh $test_string; close $fh; $test_string eq `cat $filename` or die "incorrect contents\n"; }; printf "%-33s: %s", $o, $@ ? $@ : "OK\n"; } print "\n"; } sub remove { unlink shift; } sub truncate { open my $fh, '>', shift or die $!; return; } __END__ open( my $fh, @_ ) : No such file or directory at (eval 1) line 1. open( my $fh, @_[ 0..$#_ ] ) : No such file or directory at (eval 2) line 1. open( my $fh, shift, @_ ) : OK open( my $fh, @_ ) : No such file or directory at (eval 5) line 1. open( my $fh, @_[ 0..$#_ ] ) : Filehandle $fh opened only for input at pita.pl line 25. open( my $fh, shift, @_ ) : OK