这是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) 我想在字符串中捕捉罗马数字(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)
因此,这个也可以自己捕获字边界,因为所有组都是可选的.如何完成它?如何强制执行这两个组中的一组,而无法确定哪一组是强制性的?其他捕捉罗马人的方法也很受欢迎.
在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) 我在数据库中有很多供应商,他们在数据的某些方面都有所不同.我想制作基于以前数据的数据验证规则.
例:
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个样本,然后将分析结果与新数据进行比较.相似性可以基于长度,字符/数字的使用,字符串创建模式,类似的开始/结束/中间,具有一些分隔符.
我觉得这不是一件容易的事,但另一方面,我觉得它有很广泛的用途.所以我希望,已经有了一些提示.
灵感来自如何将CPAN用作非root用户?我想知道,如何为非登录用户设置cpanm(比如www)?没有登录,所以我不知道如何包含一些目录@INC.
编辑:如何为非登录用户设置PERL5LIB的永久环境变量?我无法设置它.bashrc(需要登录)而不是/etc/environment设置(设置为每个人).
我有一个函数,它依赖于调用上下文,我想使用此函数作为其他函数的参数.令人惊讶的是,我发现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) 我在数据库中有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只能看到列的访问器,而没有关系的访问器。 …
在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)
: cascade main
: around some -> {
some text 1
: include included;
some text 2
: }
Run Code Online (Sandbox Code Playgroud)
MAIN template
: block main -> {
main DEFAULT text, should replaced with included.tx one
: } # …Run Code Online (Sandbox Code Playgroud) 对于我的小型 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) 在我的对象构造函数中,我有一条语句可以同时初始化两个属性:
($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)