CGI::param called in list context というエラー

仕事で作成した管理CGIで稀に起こるエラーの対応をすべく、久し振りに家でテストしていた。 んで仕事場と自宅の環境の違いでエラーがまま出た。 ざぁっと修正して1つどうするか迷う部分が出た。 以前にも見た気がする`CGI::param called in list context `というエラー。 エラーだけど別に止まらないから放置していた。 というか環境の違いで出てこられると対応した結果、別環境で動かないとかなったら笑えない(雑魚並感) ## そもそもどういうエラーか ~~~ my @array = $query->param("os"); ~~~ 上記のようにユーザーの入力をリストで受け取ろうとすると出る。 試してないから分からないけど`$query->url_param("os")`でも出るんだろうか? で、どんな問題があるかはググれば出てくる。 正直自分のクソ頭脳ではピンと来ていない。その内理解出来てくるだろうか。 ググって気になった物をピックアップ。 >引用元:[New Class of Vulnerability in Perl Web Applications](http://blog.gerv.net/2014/10/new-class-of-vulnerability-in-perl-web-applications/) >my @array = ("foo", 3, "bar", 6); >my %hash = @array; >--> >{ "foo" => 3, "bar" => 6 } ああ、連想配列に配列代入するとキーと値の関係になるんやな。 ~~~ my %hash = ('id'=>'1'); ~~~ みたいな感じでいつも書いてたから、すっかり忘れてた。 そんな使い方しなくない?って思ったけど、 ~~~ my $str = $query->param("os"); ~~~ これがリファレンスになって問題出る? ・・・いや1つの値だけだな。 そもそもこれではエラー出ないわ。 >引用元:[New Class of Vulnerability in Perl Web Applications](http://blog.gerv.net/2014/10/new-class-of-vulnerability-in-perl-web-applications/) >my $otheruser = Bugzilla::User->create({ > login_name => $login_name, > realname => $cgi->param('realname'), > cryptpassword => $password}); なるほどなぁ・・・なんか横着すぎひん? とはいえ、しっかり展開されておかしな事になるな。 ## どう対応するか ~~~ my @array = $query->multi_param("os"); ~~~ 今回出たエラーは上記で出なくなる。 明示的にする事に意味があるんだと思う。 引用元の解決は`scalar $cgi->param('realname')`とスカラーですよとする。 先に`my $realname = $cgi->param('realname');`ってして、渡せばええやんって気がするけど何か別の問題があるんだろう。 ### 追記 `$query->url_param("os")`でも出るか試した。 エラーは出なかった。