Mojoliciousで「Can't use string ("Controller") as a HASH ref while "strict refs" in use」のエラーが発生した時の対策

Mojoliciousを使っている時に、「Can’t use string (“Sample::Controller::Post”) as a HASH ref while “strict refs” in use」と言うエラーが出てハマったので、その対処法をメモしておく。

結論:メソッド名を変更したら上手くいく

まず結論からだけど、僕の場合はcontroller内で定義したメソッド名を変更したら上手くいくようになった。

エラーになった時には、以下のようなコードを書いていた。

package Sample::Controller::Post;
use Mojo::Base 'Mojolicious::Controller';
sub new {
my $c = shift;
$c->render;
}
1;

上記のnewメソッドを適当なメソッド名に直すと、上手くいく。(new_postメソッドとか)

何が原因で上記のエラーが発生したのか?

今回の問題点なのは、newメソッドを自分で定義してしまったことだ。このままでは、以下のようなエラーが発生してしまう。

[error] Can't use string ("Sample::Controller::Post") as a HASH ref while "strict refs" in use at /Users/toumasu/.plenv/versions/5.14.2/lib/perl5/site_perl/5.14.2/Mojo/Base.pm line 72.

上記のエラー文の内容は、「use strictでリファレンスの制限をしているのに、Sample::Controller::Postと言う文字列のリファレンスを使おうとしているよ」と言うエラー。

最初は「controllerと全然関係ないじゃん」と思ったが、controller内でuse Mojo::Baseで呼び出しているMojo::Baseにはnewメソッドが使われており、このnewメソッドに自分が作ったnewメソッドが干渉を起こしてしまい、上記のエラー文が発生してしまった。

参考:mojo/Base.pm at master · mojolicious/mojo

最初は「Ruby on Railsみたいにnewとかcreateメソッド作ったら管理しやすいな」と言う感覚でメソッドを作ってしまったが、まさかこんな落とし穴があるとは。

ReratedPosts

perlのgrep関数の使い方|変数とか戻り値とか複数条件とかのまとめ
PerlのDBIで新規レコードを作成(INSERT)した時にレコードのIDを取得する方法
perlのcpanmでDBI::mysqlをインストールする際に「Configure failed for DBD-mysql-4.050. See build.log for details.」と出た時の対処法
perlでファイルの中身を全て読み込みたい時の方法
perlのコードでよく見かけるrequire、use、BEGINの役割や関係についてまとめる
perlで正規表現で文字列を置換したり、新しい変数に格納する方法