【发布时间】:2013-08-05 19:57:03
【问题描述】:
在下面的脚本中,为什么if 会计算为true,为什么会打印Has space!?
p{Space} 是 Unicode 属性,对吗?但是$_ 不包含Unicode 语句,而是包含ASCII 语句。这个脚本是如何工作的?
#!/usr/bin/perl
use strict;
use warnings;
$_ = "yabba dabba doo";
if(/\p{Space}/){
print "Has space!\n";
}
【问题讨论】:
-
ASCII 是 Unicode 的子集。
-
好吧,我对 Perl 了解不多,但在任何语言中,所有 ASCII 字符都是 Unicode。 Unicode 字符串专门用于匹配 Unicode 字符。当然,Unicode 字符串可能与 ASCII 字符串不同。但反之亦然。
-
@Jim 从程序员的角度来看,Perl 不会以某种编码方式保存字符串。它将字符串保存为代码点序列。字符串中空格字符的代码点与 Unicode“空格”属性匹配。
-
此外,Unicode 匹配规则适用于 (a) 字符串包含 > 0xFF 的字符或 (b) 正则表达式使用 Unicode 功能,如
\p。 -
标准 7 位 ASCII 是 Unicode 的真子集,Perl 内部的一切都是 Unicode。此外,ASCII 的 UTF-8 编码使所有字符保持不变。编码或表示成为问题的唯一时间是当您使用代码点大于 0x7F 的字符时。