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")`でも出るか試した。
エラーは出なかった。