use strict; my @test = ( [ '^GIF8..(....)' => sub { return ( GIF => unpack("SS", $_[1]) ); }], [ '^^\xFF\xD8.{4}JFIF' => sub { return ( JPEG => unpack("nn", $1)) if ($_[0] =~ /\xFF\xC0...(... .)/s); }], [ '^\x89PNG\x0d\x0a\x1a\x0a' => sub { return ( PNG => unpack("NN", $1)) if ($_[0] =~ /IHDR(.{8})/s); }], [ 'BM.{16}(.{8})' => sub { return ( BMP => unpack("LL", $_[1]) ); }], ); sub x_image_size { return unless $_[0]; foreach my $test (@test) { my @arg; return ($test->[1]($_[0], @arg)) if (@arg = $_[0] =~ /$test->[0]/s); } }