sysseek($fh,0,0) returned "0 but true" sysseek($fh,42,0) returned 42 sysseek($fh,-1,0) returned undef undef: bool=false, str= "", num=0 (warns: uninit x 2) "": bool=false, str= "", num=0 (warns: numeric) 0: bool=false, str= "0", num=0 "0": bool=false, str= "0", num=0 1: bool=true , str= "1", num=1 "1": bool=true , str= "1", num=1 "foo": bool=true , str= "foo", num=0 (warns: numeric) Perl's true: bool=true , str= "1", num=1 Perl's false: bool=false, str= "", num=0 "0 but true": bool=true , str="0 but true", num=0 "3 and true": bool=true , str="3 and true", num=3 (warns: numeric) "0E0": bool=true , str= "0E0", num=0 0E0: bool=false, str= "0", num=0 1E0: bool=true , str= "1", num=1 "1E0": bool=true , str= "1E0", num=1 #### use warnings; use strict; use File::Temp qw/tempfile/; use Data::Dumper; sub pp { Data::Dumper->new([@_])->Useqq(1)->Terse(1) ->Indent(0)->Dump } my ($fh) = tempfile(UNLINK=>1); print $fh "Perl"x12; for my $pos (0, 42, -1) { my $rv = sysseek($fh,$pos,0); print "sysseek(\$fh,$pos,0) returned ",pp($rv),"\n"; } print "\n"; my @vals = ( 'undef' => undef, # warns as number and string '""' => "", # warns as number '0' => 0, '"0"' => "0", '1' => 1, '"1"' => "1", '"foo"' => "foo", # warns as number "Perl's true" => !0, "Perl's false" => !1, '"0 but true"' => "0 but true", # doesn't warn as number (!) '"3 and true"' => "3 and true", # warns as number '"0E0"' => "0E0", '0E0' => 0E0, '1E0' => 1E0, '"1E0"' => "1E0", ); while (@vals) { my ($desc, $val) = (shift @vals, shift @vals); #no warnings qw/ uninitialized numeric /; printf "%13s: bool=%-5s, str=%12s, num=%s%s\n", do { my %w; local $SIG{__WARN__} = sub { my $w = shift; if ($w=~/numeric/) { $w{numeric}++ } elsif ($w=~/uninitialized/) { $w{uninit}++ } else { warn $w } }; ($desc, $val?'true':'false', '"'.$val.'"', 0+$val, keys(%w) ? " (warns: ".join(',',map {$w{$_}>1?"$_ x $w{$_}":$_} sort keys %w).")" : '' ); }; }