尝试运行简单的mojolicious程序时出错

pac*_*tie 1 perl mojolicious

Mojolicious的新手.我有两个文件,test1.pl和test2.pm,尝试在我的PC上运行它时出错(Ubuntu 12.04).

$ morbo test1.pl 
Couldn't load application from file "test1.pl": Can't call method "render" on an undefined value at test2.pm line 11.
Run Code Online (Sandbox Code Playgroud)

有任何想法吗?谢谢.

这是两个文件

######### test1.pl
use Mojolicious::Lite;
no warnings;
use test2;

get '/' => test2::sendMainPage;
Run Code Online (Sandbox Code Playgroud) ######### test2.pm
package test2;
use Mojolicious::Lite;
use URI::Escape;
use HTML::Entities;
use Data::Dumper;
use JSON;
use Exporter 'import';

sub sendMainPage {
    my $self  = shift;
    $self->render(text => q|<html><body>
<h1>Welcome to test demo page</h1>
</body></html>|);
}


1;
Run Code Online (Sandbox Code Playgroud)

Mil*_*ler 8

在设置路线时,您需要传递对子的引用:

use Mojolicious::Lite;
no warnings;
use test2;

get '/' => \&test2::sendMainPage;
Run Code Online (Sandbox Code Playgroud)

否则,你实际上是在没有参数的情况下调用sub,因此就是错误.

另外,不要这样做no warnings;.包含use strict;use warnings;在您创建的每个脚本脚本的顶部.Mojolicious::Lite默认情况下启用这些编译指示的原因有很多.

如果你这样做了,你会得到这个警告,它会提醒你这个问题:

Bareword "test2::sendMainPage" not allowed while "strict subs" in use at test1.pl line 5.
Run Code Online (Sandbox Code Playgroud)

最后,始终将您的包名称大写. Test2而不是' test2.从perlstyle

Perl非正式地保留了"pragma"模块的小写模块名称,如integer和strict.其他模块应以大写字母开头并使用大小写,但可能没有下划线,原因是原始文件系统将模块名称表示为必须适合几个稀疏字节的文件.

最终工作代码:

test1.pl

use strict;
use warnings;

use Mojolicious::Lite;

use Test2;

get '/' => \&Test2::sendMainPage;

app->start;

__DATA__
Run Code Online (Sandbox Code Playgroud)

Test2.pm

package Test2;

use strict;
use warnings;

sub sendMainPage {
    my $self  = shift;
    $self->render(text => q|<html><body>
<h1>Welcome to test demo page</h1>
</body></html>|);
}

1;

__DATA__
Run Code Online (Sandbox Code Playgroud)