大体のブラウザではファイルが選択されていない場合、空文字が入りますのでdefinedでは常に真になります。
ベターなチェック方法は
if( defined( $cgi->upload( "cgi"))) {}
です。
この方法ならファイル選択をせずテキストボックスに適当な文字を入力されたケースにも対応できます(偽が返る)。