考虑文件中的以下输入数据y.txt(以UTF-8编码).
bar
föbar
Run Code Online (Sandbox Code Playgroud)
和一个文件y.pl,它将两个输入行放入一个数组并处理它们,寻找子串起始位置.
use open qw(:std :utf8);
my @array;
while (<>) {
push @array, $_;
print $-[0] . "\n" if /bar/;
}
# $array[0] = "bar", $array[1] = "föbar"
print $-[0] . "\n" if $array[1] =~ /$array[0]/u;
Run Code Online (Sandbox Code Playgroud)
如果我打电话perl y.pl < y.txt,我会
0
2
3
Run Code Online (Sandbox Code Playgroud)
作为输出.但是,我希望最后一个数字也是2,但由于某种原因,第二个正则/.../表达式表现不同.我错过了什么?我想这是一个编码问题,但无论我怎么做,我都没有成功.这是Perl 5.18.2.
我打赌有人之前已经解决了这个问题,但我的搜索结果是空的.
我想将一个单词列表打包到一个缓冲区中,跟踪每个单词的起始位置和长度.诀窍是我想通过消除冗余来有效地打包缓冲区.
示例:娃娃娃娃屋
这些可以简单地打包到缓冲区中dollhouse,记住doll是从位置0开始的四个字母,在0处dollhouse是九个字母,house在3处是五个字母.
到目前为止我想出的是:
由于长词通常包含较短的单词,因此效果很好,但应该可以做得更好.例如,如果我将单词列表扩展为包含ragdoll,那么我的算法会出现dollhouseragdoll效率低于ragdollhouse.
这是一个预处理步骤,所以我对速度并不十分担心.O(n ^ 2)很好.另一方面,我的实际列表有数万个单词,所以O(n!)可能是不可能的.
作为旁注,这个存储方案用于TrueType字体的`name'表中的数据,参见.http://www.microsoft.com/typography/otspec/name.htm
假设我有一个像
char foo[] = { 0, 1, 1, 0 };
Run Code Online (Sandbox Code Playgroud)
在gdbx86机器上,如果我说
p (short[2])*foo
Run Code Online (Sandbox Code Playgroud)
我懂了
{256, 1}
Run Code Online (Sandbox Code Playgroud)
这就是说,两个字节short按小端顺序解释。
是否有一种方便的方法(例如宏)来使gdb字节数组显示为大端短(或其他类型)呢?
考虑下面的C99结构,以灵活的数组成员结尾:
struct hdr
{
size_t len;
size_t free;
char buf[];
};
Run Code Online (Sandbox Code Playgroud)
len例如,使用这样的内联函数(放入头文件中)进行访问,并将其buf作为参数:
static inline size_t slen(const char *s)
{
struct hdr *h = (struct hdr*)(s - (int)offsetof(struct hdr, buf));
return h->len;
}
Run Code Online (Sandbox Code Playgroud)
这是库的一部分,将使用C编译器进行编译。但是,我想从C ++访问该库。这实质上意味着相应的头文件(带有适当的extern "C" {...}防护)必须是有效的C ++代码。一种可能的解决方案是slen在源代码主体中定义功能,而完全避免使用内联代码,但这不是最佳选择。
我的想法是定义一个有效的虚拟C ++结构,并且可以通过某种方式将其映射到hdr,例如
struct cpp_hdr
{
size_t len;
size_t free;
char buf[1];
}
Run Code Online (Sandbox Code Playgroud)
请注意,我只希望得到正确的(负)的偏移值len和free; 没有访问buf的意图。
现在我的问题是:是否有任何保证
static inline size_t slen(const char *s)
{
struct cpp_hdr *h = (struct cpp_hdr*)(s …Run Code Online (Sandbox Code Playgroud)