2

使用 Rose::DB 时出现错误。


#MyApp/DB.pm
package MyIMDB::DB;
use strict;  use warnings;
use base qw(Rose::DB);
__PACKAGE__->use_private_registry;
__PACKAGE__->register_db (
    driver   => 'SQLite',
    ....
);
1; 

# MyApp/DB/Object.pm
package MyApp::DB::Object;
use strict;  use warnings;
use MyApp::DB;
use base qw(Rose::DB::Object);
sub init_db { MyIMDB::DB->new }
1;

#
package MyApp::Users;   #controller       
use strict;  use warnings;
use base 'Mojolicious::Controller';
use Mojo::ByteStream 'b';
use MyApp::Models::User;
use Data::Dumper;

sub my_action {
  my $uc = shift;
  my $err =  MyApp::Models::User::->validate(...);   #extra ::
                            # http://perldoc.perl.org/perlobj.html#Invoking-Class-Methods
}

# MyApp/Models/User.pm    # 2 packages in this file
package MyApp::Models::User::Manager;
use base qw(Rose::DB::Object::Manager);
use MyApp::Models::User;
sub object_class { 'MyApp::Models::User'}
__PACKAGE__->make_manager_methods('users');
  # class methods get_x, get_x_iterator, get_x_count, delete_x, update_x
1;

MyApp::Models::User
use strict;  use warnings;
use base qw(MyApp::DB::Object);
__PACKAGE__->meta->setup(
    #setup tables, columns....
  );

sub validate {
  my $u = shift;
  my $n = MyApp::Models::User::Manager::->get_users_count(query => [user_name => $user]);
}  
1;

我得到的错误是:

"Can't use string ("MyApp::Models::User") as a HASH ref while "strict refs" 
 in use at /usr/local/share/perl/5.18.2/Rose/DB/Object.pm line 91, <DATA> line 2231."

入口点是类的my_action()方法MyApp:Users

我尝试了创建类的替代设置MyApp::Models::User::Manager:单独的 .pm 文件,make_manager_class()但无济于事。

(我从 2007 年发现这个讨论带有相同的错误消息,但它并没有帮助我 http://comments.gmane.org/gmane.comp.lang.perl.modules.dbi.rose-db-object/1537) .

这可能表明我正在尝试调用一个对象方法,就好像它是一个类方法一样。我尝试了这里列出的技巧http://perldoc.perl.org/perlobj.html#Invoking-Class-Methods,但没有成功。

我现在可以用 来检查变量的内容Data::Dumper,但我不知道要转储什么,因为使用的数据结构很少。

4

1 回答 1

0

虽然use strict在编写 Perl 代码时是一个好主意,但您可能希望通过添加

no strict `refs`;

克服当前的错误。正如@ikegami 指出的另一种解决此问题的方法是摆脱不良参考,但如果您不想重写模块以放松严格性来解决它是您最好的选择。

于 2015-09-25T00:43:06.650 回答