不幸的是,我没弄明白,为什么$alfa仍然是空的:
use 5.014;
no strict 'refs';
my $berta = 5;
my $gamma = 'berta';
my $alfa = ${$gamma};
say "'$alfa'";
Run Code Online (Sandbox Code Playgroud)
必须是非常简单的事情...我期待$alfa成为5这里.我错过了什么?
使用knockout.mapping我尝试从JSON映射到ko-object.当我尝试使用带有映射选项的更高级解决方案时,我常常得到Uncaught TypeError: g is not a function.我试图弄清楚什么是问题,但我仍然感到困惑.
可以说我有一个非常简单的模型:
var data1 = { // works
a: "a",
b: [
{ b1: "v1" },
{ b2: "v2" }
]
};
Run Code Online (Sandbox Code Playgroud)
现在使用这个模型就像这样:
function viewModel ( data ) {
var self = this;
var a = ko.mapping.fromJS( data, { observe: "a"} );
return a;
}
var vm1 = viewModel( data1 ); // works
Run Code Online (Sandbox Code Playgroud)
我的模型中有两个属性(a和b),但我只需a要是可观察的,而b应该只是复制到viewmodel.
遗憾的是,如果数据结构变得更深,它就不会那么好用:
var data1 = { // works
a: "a",
b: …Run Code Online (Sandbox Code Playgroud) 试图在FastCGI下运行旧的CGI脚本.没有额外参数的打印可提供正确的输print $q->div( $q->param("text") )
但是当使用CGI方法的额外参数哈希打印出来时print $q->div( {-id=>"id"}, $q->param("text") ),它会破坏UTF-8形成的数据('õäöüžš' - >'ÃμÃÃÃÃÃÃÃüüžš
它只发生在CGI参数中,在脚本定义的变量中工作正常(例3和4).在普通的CGI(带有"-utf8"-flag)下,一切都很完美.
被称为FastCGI的示例脚本test.fcgi?text=õäöüžš应该给出四个相等的块:
#!/usr/bin/perl -w --
use strict;
use CGI::Fast qw(:all);
use locale;
use utf8;
BEGIN {
binmode(STDIN); # Form data
binmode(STDOUT, ':encoding(UTF-8)'); # HTML
binmode(STDERR, ':encoding(UTF-8)'); # Error messages
}
my ($q) = ();
my $test = "õäöüžš";
while ($q = new CGI::Fast) {
print $q->header(-type=>"text/html", -charset=>"utf-8"),
$q->start_html(-encoding=>"utf-8");
print "1: ",
$q->div( $q->param('text') ),
"<br />",
"2: ",
$q->div( {-id=>"id"}, $q->param('text') ),
"<br />", …Run Code Online (Sandbox Code Playgroud) 我已经尝试了一些简单的示例来尝试它们,但没有人适合我.这是一个WebSocket Mojolicious/DBI示例的示例
我在端口5000上使用plackup运行它,一切都应该正常工作.但是当我尝试添加一些我在终端上看到的记录时:
[Sat Mar 9 11:05:57 2013] [debug] GET /insert (Anonymojo).
[Sat Mar 9 11:05:57 2013] [debug] Template "not_found.development.html.ep" not found.
[Sat Mar 9 11:05:57 2013] [debug] Template "not_found.html.ep" not found.
[Sat Mar 9 11:05:57 2013] [debug] Rendering cached inline template.
[Sat Mar 9 11:05:57 2013] [debug] Rendering cached inline template.
[Sat Mar 9 11:05:57 2013] [debug] 404 Not Found (0.012583s, 79.472/s).
127.0.0.1 - - [09/Mar/2013:11:05:57 +0200] "GET /insert HTTP/1.1" 404 6440 "-" "-"
Run Code Online (Sandbox Code Playgroud)
当我在"/ insert"上定位浏览器时,我得到几乎相同的(exept UserAgent部分)结果.
在示例脚本中,定义了websockets路由,但它从未被命中: …
我想根据主键从中等大小(700K)表中删除大量行。认为,最好的方法应该使用SELECT-subquery 作为DELETE源列表。并在这里找到了具体的答案。问题是:它比使用两个单独的查询(首先选择 ID,然后从表中删除这些 ID)慢得多。为什么会这样?
我也做了简单的测试用例:
CREATE TABLE `xyz` (
`xyzID` int(10) unsigned NOT NULL AUTO_INCREMENT,
`col1` int(10) unsigned NOT NULL DEFAULT '0',
PRIMARY KEY (`xyzID`)
) ENGINE=InnoDB;
Run Code Online (Sandbox Code Playgroud)
用百万条记录填充它,然后:
DELETE FROM xyz
WHERE xyzID IN
(
SELECT xyzID
FROM
(
SELECT xyzID
FROM xyz
LIMIT 3000,1000
) a
);
Query OK, 1000 rows affected (53.52 sec)
Run Code Online (Sandbox Code Playgroud)
删除 2000 行会使时间加倍:
Query OK, 2000 rows affected (1 min 48.25 sec)
Run Code Online (Sandbox Code Playgroud)
但是在没有子查询的情况下删除(首先进行选择)几乎不需要时间(此处由随机生成的 id 列表):
DELETE FROM test.xyz WHERE …Run Code Online (Sandbox Code Playgroud) 我jsonb在 Postgres 表中有这样的结构:{ "res": [123, 223] }并且我想将值推入res-array 中。我不知道数组上有多少个值以及jsonb_insert对位置进行操作,所以我尝试使用-1位置:
select jsonb_insert( '{"res": [123, 223]}', '{res,-1}', '333');
jsonb_insert
--------------------------
{"res": [123, 333, 223]}
Run Code Online (Sandbox Code Playgroud)
这是行不通的。如何将新值推入数组末尾?
我正在使用 Postgres 9.6
我有一个带有jsonb列的表,其中列的默认值为null. 现在,当我第一次尝试使用数据更新此列时,jsonb_set或者jsonb_insert我得到UPDATE 1了结果,但实际上,该列保持null.
我做了一个小测试用例:
CREATE SCHEMA test;
CREATE TABLE test.books (
book_id serial NOT NULL,
data jsonb
);
INSERT INTO test.books (data) VALUES (null);
INSERT INTO test.books (data) VALUES ('{}');
Run Code Online (Sandbox Code Playgroud)
现在我更新两个新记录:
UPDATE test.books SET data = jsonb_set( data, '{zzz}', 'true', true) WHERE book_id = 1;
UPDATE test.books SET data = jsonb_set( data, '{zzz}', 'true', true) WHERE book_id = 2;
Run Code Online (Sandbox Code Playgroud)
结果:
# select * from test.books;
book_id | data …Run Code Online (Sandbox Code Playgroud) 当我use locale,我的语言环境(et_EE.UTF-8)中的一些字符与之匹配时\w,我没有看到任何理由.
除了ASCII之外,爱沙尼亚还使用了六个字符:
õäöüšž
在我下面的测试脚本中,我使用$string了三个额外的特殊字符ð??(不属于爱沙尼亚字母).
use feature 'say';
use POSIX qw( locale_h );
{
use utf8;
my $string = "õäöüšž ð??";
binmode STDOUT, ":encoding(UTF-8)";
say "nothing";
say 'LOCALE: ', setlocale(LC_CTYPE), ' ', setlocale(LC_COLLATE);
say 'UC: ', uc( $string );
say 'SORT: ', sort( split(//, $string) );
say $string =~ m/\w/g;
say $string =~ m/\p{Word}/g;
say '';
}
{
use utf8;
use locale;
binmode STDOUT, ":encoding(UTF-8)";
my $string = "õäöüšž ð??";
say "locale"; …Run Code Online (Sandbox Code Playgroud) 在转换数据库的过程中,我尝试使用最佳/最快插入.AFAIK,惯用的大量插入应该准备语句处理程序,然后迭代数据插入它.像这样的东西:
my $sql = q|INSERT INTO test.table ( value ) VALUES ( ? ) |;
my $sth = $dbh->prepare( $sql );
for my $val ( 1 .. 1000000 ) {
$sth->execute( $val );
}
Run Code Online (Sandbox Code Playgroud)
我认为在state-declarator 的帮助下我可以将这个例程重构为函数,如下所示:
sub sql_state {
my ( $val ) = @_;
state $sql = q|INSERT INTO test.table ( value ) VALUES ( ? ) |;
state $sth = $dbh->prepare( $sql );
$sth->execute( $val )
or die "State";
}
Run Code Online (Sandbox Code Playgroud)
所以现在$sql在所有插入过程中初始化一次,并且还$sth准备一次,这是增强的基础.
在迁移我的数据库期间,我觉得这种改进并没有像我希望的那样给我这样的胜利.然后我发现了一篇文章 …
我写了一个脚本,我在UTF-8编码的HTML文件中啜饮,然后将其解析为树HTML::Tree.问题是解析后的字符串不再标记为UTF-8.
由于_utf8_on()不建议设置标志的方式,我正在寻找正确的方法.
我的简化代码示例:
#!/usr/bin/perl
use strict;
use warnings;
use 5.010;
use utf8::all;
use autodie;
use HTML::Tree;
use Encode qw/is_utf8/;
my $file = shift;
my $tree;
if ($file) {
my $content = slurp_in( 'file' => $file );
$tree = html_tree('content' => $content);
} else {
die "no file";
}
my $title = $tree->look_down(_tag => 'title');
$title = $title->as_HTML('');
if ( is_utf8( $title ) ) {
say "OK: $title";
} else {
say "NOT OK: $title";
}
## …Run Code Online (Sandbox Code Playgroud) 在脚本中,我初始化几个处理程序并设置应该可用于单独模块中的函数的变量.这是使用它们(的最好方式$q,$dbh,%conf模块)?
伪模块示例:
package My::Module
sub SomeFunction (
@data = $dbh->selectrow_array("SELECT * FROM Foo WHERE Bar = ?", undef, $conf{Bar} );
return $q->p( "@data" );
)
1;
Run Code Online (Sandbox Code Playgroud)
伪脚本示例:
use CGI;
use DBI;
use My::Module;
our $q = new CGI;
our $dbh = some_connenction_function($dsn);
our %conf = ( Foo => 1, Bar => 2, Random => some_dynamic_data() );
Run Code Online (Sandbox Code Playgroud)
我明白使用main::命名空间会起作用,但是sholud是更清洁的方式吗?或不?
perl ×7
utf-8 ×3
jsonb ×2
mysql ×2
postgresql ×2
benchmarking ×1
cgi ×1
dbi ×1
fastcgi ×1
html-parsing ×1
html-tree ×1
javascript ×1
knockout.js ×1
locale ×1
mojolicious ×1
perl-module ×1
sorting ×1
unicode ×1
websocket ×1