小编w.k*_*w.k的帖子

Perl DBI:如何查看带有绑定值的失败查询?

这是DBI手册中的标准插入示例:

     my $query = q{
       INSERT INTO sales (product_code, qty, price) VALUES (?, ?, ?)
     };
     my $sth = $dbh->prepare($query) or die $dbh->errstr;
     while (<>) {
         chomp;
         my ($product_code, $qty, $price) = split /,/;
         $sth->execute($product_code, $qty, $price) or die ($query . " " . $dbh->errstr);
     }
     $dbh->commit or die $dbh->errstr;
Run Code Online (Sandbox Code Playgroud)

我修改了一下,所以我可以看到哪个查询失败(die ($query . " " . $dbh->errstr)).我仍然希望看到带有绑定值的查询(因为它已被执行).怎么弄?


编辑

顺便说一下,我发现了一种查看绑定值查询的尴尬方法:你必须在查询中出现语法错误.例如,如果我更改上面的查询:

     my $query = q{
       xINSERT INTO sales (product_code, qty, price) VALUES (?, ?, ?)
     }; …
Run Code Online (Sandbox Code Playgroud)

perl dbi

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

如何在字符串中捕捉罗马数字?

我想在字符串中捕捉罗马数字(80以下的数字足够好).我找到了很好的基础,你如何只使用正则表达式匹配有效的罗马数字?.问题是:它处理整个字符串.我还没有找到如何检测字符串内的罗马数字的解决方案,因为没有强制要求,每个组都可以是可选的.到目前为止我尝试过这样的事情:

my $x = ' some text I-LXIII iv more ';

if (  $x =~  s/\b(
                    (
                        (XC|XL|L?X{0,3}) # first group 10-90
                    |
                        (IX|IV|V?I{0,3}) # second group 1-9
                    )+
            )
        \b/>$1</xgi ) { # mark every occurrence
    say $x;
}

__END__
 ><some>< ><text>< ><>I<><-><>LXIII<>< ><>iv<>< ><more>< 
 desired output:
  some text >I<->LXIII< >iv< more 
Run Code Online (Sandbox Code Playgroud)

因此,这个也可以自己捕获字边界,因为所有组都是可选的.如何完成它?如何强制执行这两个组中的一组,而无法确定哪一组是强制性的?其他捕捉罗马人的方法也很受欢迎.

regex perl

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

如何在Catalyst应用程序中正确使用Schema中的UTF-8编码数据?

在Catalyst应用程序或模板中定义的数据具有正确的编码并且显示良好,但是从数据库中将所有非Latin1转换为?.我想问题应该在模型类中,这是这样的:

use strict;
use base 'Catalyst::Model::DBIC::Schema';

__PACKAGE__->config(
 schema_class => 'vhinnad::Schema::DB',

 connect_info => {
     dsn => 'dbi:mysql:test',
     user => 'user',
     password => 'password',
     {
         AutoCommit        => 1,
         RaiseError        => 1,
         mysql_enable_utf8 => 1,
     },
     'on_connect_do' => [
             'SET NAMES utf8',
     ],      
     }
);

1;
Run Code Online (Sandbox Code Playgroud)

我看到这里没有瑕疵,但有些事情一定是错的.我使用我的架构也测试脚本和数据编码良好,输出正确,但在Catalyst应用程序内我没有得到正确的编码.哪里可能有问题?

编辑

为了将来的参考,我把解决方案放在这里:我混合了连接信息的新旧风格.

旧式就像 (dsn, username, passw, hashref_options, hashref_other options)

新风格(dsn => dsn, username => username, etc),所以正确使用:

 connect_info => {
     dsn               => 'dbi:mysql:test',
     user              => 'user',
     password          => 'password',
     AutoCommit        => …
Run Code Online (Sandbox Code Playgroud)

perl utf-8 catalyst dbix-class

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

如何基于真实数据自动创建模式?

我在数据库中有很多供应商,他们在数据的某些方面都有所不同.我想制作基于以前数据的数据验证规则.

例:

A: XZ-4, XZ-23, XZ-217
B: 1276, 1899, 22711
C: 12-4, 12-75, 12
Run Code Online (Sandbox Code Playgroud)

目标:如果用户为供应商B输入字符串'XZ-217',算法应比较先前的数据并说:该字符串与供应商B先前的数据不相似.

是否有一些好方法/工具来实现这种比较?答案可能是一些通用的算法或Perl模块.

编辑:我同意,"相似性"很难定义.但是我想抓住算法,它可以分析之前的100个样本,然后将分析结果与新数据进行比较.相似性可以基于长度,字符/数字的使用,字符串创建模式,类似的开始/结束/中间,具有一些分隔符.

我觉得这不是一件容易的事,但另一方面,我觉得它有很广泛的用途.所以我希望,已经有了一些提示.

regex perl pattern-matching

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

如何为非登录用户设置单独的Perl模块?

灵感来自如何将CPAN用作非root用户?我想知道,如何为非登录用户设置cpanm(比如www)?没有登录,所以我不知道如何包含一些目录@INC.

编辑:如何为非登录用户设置PERL5LIB的永久环境变量?我无法设置它.bashrc(需要登录)而不是/etc/environment设置(设置为每个人).

perl cpan

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

为什么函数参数会导致列表上下

我有一个函数,它依赖于调用上下文,我想使用此函数作为其他函数的参数.令人惊讶的是,我发现second现在在列表上下文中调用此函数.我尝试强制标量上下文+()但它不能像我预期的那样工作.所以唯一的方法就是隐含地调用它scalar.

use 5.010;

say first( 1, second( 'y' ) );
say first( 1, +( second( 'y' ) ) );
say first( 1, scalar second( 'y' ) );

sub first {
  my $x = shift;
  my $y = shift;

  return "$x + $y";
}

sub second {
  my $y = shift;

  if ( wantarray ) {
    qw/ array array /;
  } else {
    'scalar';
  }
}
__END__
1 + array
1 + array
1 + …
Run Code Online (Sandbox Code Playgroud)

perl

5
推荐指数
2
解决办法
119
查看次数

如何在DBIx :: Class中定义和使用many_to_many关系?

我在数据库中有3个表,简化为:

book        book_language       language
=====  <->> ============== <<-> ========
bookID      book_languageID     languageID
title       bookID              language
            languageID
Run Code Online (Sandbox Code Playgroud)

使用DBIx::Class::Schema::Loader我生成的架构,对应的Result类在哪里:

Book
BookLanguage
Language
Run Code Online (Sandbox Code Playgroud)

由于某些原因Loader,未在这些表之间检测到many_to_many关系,因此我在此类中定义了自己的关系Language

package R::RMT::Result::Language;
...
__PACKAGE__->many_to_many('books' => 'book_language_rel', 'bookid_rel');
Run Code Online (Sandbox Code Playgroud)

Book课堂上:

package R::RMT::Result::Book;
...
__PACKAGE__->many_to_many('languages' => 'book_language_rel', 'languageid_rel');
Run Code Online (Sandbox Code Playgroud)

现在,我希望以此访问所有相关语言:

my $dsn = "DBI:mysql:database=rkBook";
my $schema = R::RMT->connect( $dsn, 'user', 'pwd' );

my $book_rs = $schema->resultset('Book');
say $book_rs->languages();
Run Code Online (Sandbox Code Playgroud)

但是我得到了错误:

Can't locate object method "languages" via package "DBIx::Class::ResultSet" at ...
Run Code Online (Sandbox Code Playgroud)

我错了吗?我尝试将文档中的线索拼凑在一起,但显然我弄错了。我从未见过一个完整的many_to_many关系如何运作的例子。

AFAIU,在Result类中定义关系应成为该类的访问者。我如何看到所有派生的访问者?如果我尝试转储ResultSet对象,则Data::Printer只能看到列的访问器,而没有关系的访问器。 …

perl orm dbix-class

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

如何级联 Text::Xslate 中包含的模板?

Text::Xslatecascade中,是将特定模板(或在其他模板引擎中包装)特定模板到主模板的好方法。还可以将include公共块放入模板中。

我想将include其分为主模板中的特定模板cascade,但在某种程度上,included 模板具有替换(around关键字)主模板中的某些命名部分的部分。

简化的测试用例

主程序

use strict;
use warnings;

use FindBin qw($Bin);
use Text::Xslate;

my $tx = Text::Xslate->new(
    path => [ "$Bin/template" ],
);

print $tx->render( 'some.tx' );
Run Code Online (Sandbox Code Playgroud)

模板/some.tx

: cascade main

: around some -> {

some text 1

: include included;

some text 2
: }
Run Code Online (Sandbox Code Playgroud)

模板/main.tx

MAIN template

: block main -> { 
  main DEFAULT text, should replaced with included.tx one
: } # …
Run Code Online (Sandbox Code Playgroud)

perl templates text-xslate

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

为什么我的微型 API 没有响应主体?

对于我的小型 Javascript 应用程序,我使用CGI编写了服务器端 API 函数。

我让它变得非常简单,完整的示例脚本如下所示:

#!/usr/bin/env perl

use strict; use warnings; use 5.014; 

use CGI;
use JSON;
use Data::Dumper;

my $q = new CGI;
my %p = $q->Vars;

_api_response();

sub _api_response {
  my ( $error ) = @_;
  my $res;

  my $status = 200;
  my $type = 'application/json';
  my $charset = 'utf-8';

  if ( $error ) {
    $status = 500;
    $res->{data} = {
      status => 500,
    };
    $res->{error} = {
        error => 'failure',
        message => $error,
        detail => …
Run Code Online (Sandbox Code Playgroud)

javascript api perl cgi fetch-api

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

如何以Mooseish方式声明2个从属属性?

在我的对象构造函数中,我有一条语句可以同时初始化两个属性:

($self->{token}, $self->{token_start}) = $self->_get_authorized_token();
Run Code Online (Sandbox Code Playgroud)

所以我得到了令牌,并且它在一条语句中一起开始了。

现在我尝试移植我的模块以使用Moo(se),在这里我不知道如何同时设置这两个绑定属性?一些伪代码将是这样的:

has qw/token token_start/ => (
    is  => 'rw',
    default => shift->_get_authorized_token(); 
);
Run Code Online (Sandbox Code Playgroud)

但是如何以Moo(se)ish方式声明2个绑定属性?


编辑。我展示了该方法的代码_get_authorized_token,也许会带来一些想法:

sub _get_authorized_token {
    my $self = shift;
    my $postData = { 'apikey' => $self->{key} };
    my $url = $self->{base_url} . '/seller';
    my $xml = $self->_post(url => $url,
                            postdata => $postData,
                        );
    my $ref = XMLin($xml, SuppressEmpty => '' );
    my $time = $ref->{Notification_Datetime};
    my $token = $ref->{Notification_Data}{body}{token};
    return ($token, $time); 
}
Run Code Online (Sandbox Code Playgroud)

perl moose moo

4
推荐指数
1
解决办法
232
查看次数