小编ste*_*enl的帖子

在Moose属性访问器上进行字符串重载的最佳方法是什么?

我有一个类,我想在其id属性上应用字符串重载.但是,Moose不允许在属性访问器上进行字符串重载.例如:

package Foo;
use Moose;
use overload '""' => \&id, fallback => 1;
has 'id' => (
    is => 'ro',
    isa => 'Int',
    default => 5,
);

package main;
my $foo = Foo->new;
print "$foo\n";
Run Code Online (Sandbox Code Playgroud)

以上将给出错误:

You are overwriting a locally defined method (id) with an accessor at C:/perl/site/lib/Moose/Meta/Attribute.pm line 927
Run Code Online (Sandbox Code Playgroud)

我尝试了几种方法来解决这个问题:

  1. 标记id is => bare,并用我自己的访问器替换它:sub id {$_[0]->{id}}.但这只是一个黑客.

  2. 让字符串重载器使用另一个方法,只需委托回id : sub to_string {$_[0]->id}.

我只是想知道是否有人有更好的方法这样做?

perl moose

10
推荐指数
2
解决办法
1091
查看次数

ZeroMQ是否已准备好投入生产?

1年前在这里问了同样的问题.我正在寻找今天的状态更新.

  • 错误消息,文档等如何?
  • 是否存在导致开发问题的频繁错误?
  • 性能如何?

messaging zeromq

8
推荐指数
1
解决办法
773
查看次数

DBI语句可以处理使用缓存调用execute()吗?

我有一个数据库很少更改的应用程序,并且应用程序需要从数据库中进行大量读取,这会显着降低性能.其中许多读取完全相同.所以我想让DBI缓存数据库读取的结果.

例如,

$sth = $dbh->prepare('SELECT a, b FROM a_table WHERE c = ?');
$sth->execute(5);
$sth->execute(2);
$sth->execute(5); # this call loads the cached result set
Run Code Online (Sandbox Code Playgroud)

我首先想到的是这是什么prepare_cached,但我意识到它只缓存语句句柄本身而不是语句句柄的实际执行.

我想我可以通过在memoized sub中包装语句执行来实现我想要的.但我只是看到DBI本身是否有快捷方式.

perl performance dbi

6
推荐指数
1
解决办法
323
查看次数

如何在Mojolicious中测试重定向?

我想测试一个带有表单的页面,该表单在提交时将重定向到提交项目的结果页面.

我的Mojolicious控制器包含:

sub submit_new {
    my $self = shift;

    my $new = $self->db->resultset('Item')->new( {
        title       => $self->param('title'),
        description => $self->param('description'),
    } );
    $new->insert;

    # show the newly submitted item
    my $id = $new->id;
    $self->redirect_to("/items/$id");
}
Run Code Online (Sandbox Code Playgroud)

该控制器的测试脚本包含:

use Test::More;
use Test::Mojo;

my $t = Test::Mojo->new('MyApp');

my $tx = $t->ua->build_form_tx('/items/new/submit' => $data);
$tx->req->method('POST');
$t->tx( $t->ua->start($tx) )
  ->status_is(302);
Run Code Online (Sandbox Code Playgroud)

我的问题是它停止了302状态.如何继续重定向,以便我可以验证生成的项目页面?

perl unit-testing mojolicious

6
推荐指数
1
解决办法
1149
查看次数

如何使用Devel :: Cover标记`//`条件无法解决?

我有以下逻辑:

sub test {
    my ($x, $y) = @_;
    die unless defined $x || defined $y;
    # uncoverable condition false
    return $x // $y;
}

test( 1,     2     );
test( 1,     undef );
test( undef, 2     );
test( undef, undef );
Run Code Online (Sandbox Code Playgroud)

return声明将永远不会被覆盖的情况,其中$x$y都是不确定的.因此,覆盖率报告指出该条件未被发现:

  %  | coverage    | condition
 ------------------------------
  67 | A | B | dec | $x // $y
     |-------------|
===> | 0 | 0 |  0  | 
     | 0 | 1 |  1 …
Run Code Online (Sandbox Code Playgroud)

perl devel-cover

6
推荐指数
1
解决办法
274
查看次数

DBIx :: Class可以与存储过程而不是表一起使用吗?

通过返回结果集而不是表或视图的mssql存储过程向我提供了从db读取的访问权限.但我希望能够使用ORM读取数据.

我试图使用DBIx::Class::ResultSource::View过程调用(例如EXEC my_stored_proc ?)作为自定义查询,但这不起作用,因为它试图将过程调用转换为select语句.

有人有另一个建议吗?

perl stored-procedures dbix-class

5
推荐指数
1
解决办法
994
查看次数

将ithreads与Memoize一起使用时出错

我刚刚向Perl程序引入了线程,其中一个模块使用了Memoize.我收到此错误消息:

线程1异常终止:在禁止标量上下文中调用匿名函数; 断层

如果我同时拥有线程和Memoize,则会发生错误,但如果我删除其中一个元素,则会消失.但问题不在于Memoize不是线程安全的 - 在我的代码中,所有的memoization都发生在同一个线程中.

这是Memoize的错误吗?有没有办法可以解决这个问题?否则我将摆脱Memoize.

以下是一些示例代码来隔离问题:

use strict;
use warnings;
use threads;
use Thread::Semaphore;
use Memoize;

my $semaphore = Thread::Semaphore->new;

memoize('foo');
sub foo {
    return shift;
}

sub invoke_foo {
    $semaphore->down; # ensure memoization is thread-safe
    my $result = foo(@_);
    $semaphore->up;

    return $result;
}

my @threads;
foreach (1 .. 5) {
    my $t = threads->create( sub { invoke_foo($_) });
    push @threads, $t;
}
$_->join foreach @threads;
Run Code Online (Sandbox Code Playgroud)

perl multithreading

5
推荐指数
1
解决办法
472
查看次数

是否可以将MooseX模块与Mouse类一起使用?

我意识到所有MooseX模块通常都不可能,特别是当模块深入研究Moose和Mouse不同的元类时.

但是这个问题出现了,因为有时MooseX模块在MouseX命名空间中没有等效物,我发现我仍然可以在我的Mouse类中使用MooseX模块.但是我想问一般这个问题,即使有可用的MouseX(假设我太懒了,不能安装MouseX,或者MooseX版本是新版本的新功能).

例如,以下内容有效:

package Foo;
use Mouse;
use MooseX::Types::Common::Numeric 'PositiveInt';
has 'bar' => (
    is => 'rw',
    isa => PositiveInt,
);
Run Code Online (Sandbox Code Playgroud)

当我查看MouseX::Types::Common::Numeric源代码时它几乎是一个完全相同的副本MooseX::Types::Common::Numeric,尽管MouseX :: Types中存在差异,这是一个依赖项.由于它是perl代码,因此使用MouseX模块也没有特别的性能优势.

因此,如果我们有一个Mouse类并且可以选择使用等效的MooseX和MouseX模块,那么我们选择MouseX选项的原因是什么?为什么MouseX等价?

顺便问一下,我们应该如何与此相关Any::Moose

perl moose

3
推荐指数
1
解决办法
153
查看次数

MooseX :: Method :: Signatures可以与非Moose类一起使用吗?

我尝试了以下内容:

package Foo;
sub new {
    my ($type) = @_;
    return bless {}, $type;
}

package Bar;
use Moose;

package Baz;
use Moose;
use MooseX::Method::Signatures;

method exec1 (Foo $f, Bar $b) {
    ...;
}
method exec2 ($f where {$_->isa('Foo')}, Bar $b) {
    ...;
}
Run Code Online (Sandbox Code Playgroud)

我发现exec2可以工作,但对于exec1,存在编译时错误.如果Foo是Mouse对象(这些是我无法更改的类),则会发生同样的错误.

'Foo' could not be parsed to a type constraint - maybe you need to pre-declare the type with class_type at C:/strawberry/perl/site/lib/Parse/Method/Signatures/TypeConstraint.pm line 74
Run Code Online (Sandbox Code Playgroud)

但有没有办法可以使用exec1签名?

perl moose

3
推荐指数
1
解决办法
153
查看次数