$_ = 'email=&nicname=hoge';
これを分割してフィールドごとに分割し、後に、名前と値で分割するが、このとき正規表現による篩い分けを行っているため、キーにemailをもつハッシュ%qは作られない。つまり、$q{email}は未定義ということになる。これは旧来の手法と異なる結果である。旧来の方法では$q{email}は定義されているが空文字列ということになる。旧来の方法では余分なメモリを消費していたことになると思う。つまり、CGIにとったらメールアドレスが書き込まれたか書き込まれなかったかを知りたいので、書き込まれなかった場合にこれが空文字なのか未定義なのかはどうでも良いことだと思う。したがって多分新しい方法と旧来の方法は互換性があると思う。
また別の例で次のようなれいについて考えてみる。この場合、$q{nicname}=0である。
$_ = 'email=&nicname=0';
ニックネームの入力判定を行う場合、旧来の方法を使うと次のように条件判定文を書くことになるだろう。つまり、$q{'nicname'}が空文字列の場合にエラーメッセージ表示という事である。
if ( $q{'nicname'} eq '' ){ print 'ニックネームが入力されていません。'; }
新しい方法では値が空文字列の場合には要素自体が作製されないため、ニックネームの入力判定を行うには次のようにするのが望ましい。
if ( !defined $q{'nicname'} ){ print 'ニックネームが入力されていません。'; }
新しい方法に置換して旧来の判定を使うと、設定によってはエラーメッセージが出ることがある。なぜなら、旧来の条件判定文では$q{'nicname'}が判定以前に定義されていることが判定を行うための必要条件だからだ。$q{'nicname'}が未定義の場合、定義されていない可能性があります、というエラーを吐く可能性がある。といってもこの手のエラーはPerlのエラーメッセージの危険度的に言えば、最も危険度が低いエラーメッセージだったはずなので、多分問題ないだろう。まぁ気になるのなら旧来の方法をそのまま使い続ければいい。新しい方法は旧来の方法が長すぎて入力がめんどくさいから作ったのである。スクリプトを書き換えるほうがよっぽどめんどくさいので、新しい方法はこれから書き始めるスクリプトに適応されるものと考えたほうがいいと思う。
つまり未定義と言うことは、空文字列だったと言うことである。