在字符串编码然后解码后,我无法将utf8字符串连接到另一个字符串.
#!/usr/bin/perl
use strict;
use utf8;
use URI::Escape;
# binmode(STDOUT, ":utf8");
my $v = "?????????";
my $v2 = uri_unescape(uri_escape_utf8($v));
print "Works: $v, ", "$v2\n";
print "Fails: $v, $v2\n";
print "Works: " . "$v2\n";
Run Code Online (Sandbox Code Playgroud)
这是输出:
Works: ????????? ,?????????
Wide character in print at ./testUTF8.pl line 14.
Fails: ?????????, ضثصثضصثشس
Works: ?????????
Run Code Online (Sandbox Code Playgroud)
如果我使用binmode utf8,正如perl的文档所示,警告消息消失但所有3都失败:
Fails: ?????????, ضثصثضصثشس
Fails: ?????????, ضثصثضصثشس
Fails: ضثصثضصثشس
Run Code Online (Sandbox Code Playgroud)
这是怎么回事?我怎样才能解决这个问题?
PS我需要它转义URL.有没有什么方法可以逃脱/ unescape在perl像javascript一样?例如,Perl给我:%D8%B6%D8%AB%D8%B5%D8%AB%D8%B6%D8%B5%D8%AB%D8%B4%D8%B3
这可以解决:ØØØ«ØμØ«ØØØμØ«Ø'س
当我用Javascript转义相同的文本时,我得到:%u0636%u062B%u0635%u062B%u0636%u0635%u062B%u0634%u0633
我很长一段时间才遇到了Perl的第一个奇怪的"怪癖".我似乎无法在网上找到它的任何文档,我不知道Perl在做什么.
让我们切入追逐:
my $name = "Steve";
my $v = "$name's name is $name";
Run Code Online (Sandbox Code Playgroud)
$ v的价值将变成"名字是史蒂夫".我使用vim,第一个$ name变成奇怪的颜色(绿色而不是普通的蓝绿色).所以我知道这是一个众所周知的功能,但我不明白发生了什么.
对于那些可能想要提出替代方案的人,我知道我可以做任何一件事而没有任何问题:
$v = $name . "'s name is $name";
$v = "${name}'s name is $name";
Run Code Online (Sandbox Code Playgroud)
我很好奇Perl在我给出的第一个案例中做了什么以及它的用途是什么.
在程序的顶部和末尾,我使用clock()来计算程序完成所需的时间.不幸的是,它的报告时间似乎只有一半.我用"time"命令仔细检查了这一点.
我的计划报告:在45.86s完成
时间命令报告:实际0m22.837s用户0m45.735s sys 0m0.152s
使用我的手机定时,它在23秒完成(又名:"真实"时间)."用户"时间是所有线程的总和,因为我使用的是OpenMP.(你可以在这里阅读:'真实','用户'和'sys'在时间(1)的输出中是什么意思?)
那么,为什么clock()报告的是"用户"时间而不是"真实"时间?我应该使用不同的函数来计算程序运行的时间吗?
作为旁注,Windows的clock()按预期工作,并在"实际"时间内报告.
当我使用@ $ arrayRef或@ {$ arrayRef}取消引用数组时,它似乎创建了数组的副本.是否有正确的方法来取消引用数组?
这段代码......
sub updateArray1 {
my $aRef = shift;
my @a = @$aRef;
my $aRef2 = \@a;
$a[0] = 0;
push(@a, 3);
my $aRef3 = \@a;
print "inside1 \@a: @a\n";
print "inside1 \$aRef: $aRef\n";
print "inside1 \$aRef2: $aRef2\n";
print "inside1 \$aRef3: $aRef3\n\n";
}
my @array = (1, 2);
print "before: @array\n";
my $ar = \@array;
print "before: $ar\n\n";
updateArray1(\@array);
print "after: @array\n";
$ar = \@array;
print "after: $ar\n\n";
Run Code Online (Sandbox Code Playgroud)
......有输出......
before: 1 2
before: ARRAY(0x1601440)
inside1 @a: …
Run Code Online (Sandbox Code Playgroud)