英语法语西班牙语

OnWorks 网站图标

perlhacktut - 云端在线

在 OnWorks 免费托管服务提供商中通过 Ubuntu Online、Fedora Online、Windows 在线模拟器或 MAC OS 在线模拟器运行 perlhacktut

这是 perlhacktut 命令,可以使用我们的多个免费在线工作站之一在 OnWorks 免费托管服务提供商中运行,例如 Ubuntu Online、Fedora Online、Windows 在线模拟器或 MAC OS 在线模拟器

程序:

您的姓名


perlhacktut - 演练创建一个简单的 C 代码补丁

商品描述


本文档将带您了解一个简单的补丁示例。

如果您还没有阅读 perlhack,请先阅读! 您可能还想通读
perlsource 也是。

完成此处后,接下来查看 perlhacktips。

OF A 简单 补丁


让我们从头到尾做一个简单的补丁。

这是 Larry 建议的:如果“U”是“pack”期间的第一个活动格式,
(例如,"pack "U3C8", @stuff")则结果字符串应被视为 UTF-8
编码。

如果您正在使用 Perl 存储库的 git clone,您将需要创建一个
分支以进行更改。 这将使创建适当的补丁变得更加简单。 见
perlgit 有关如何执行此操作的详细信息。

写作 补丁
我们准备如何解决这个问题? 首先我们找到有问题的代码 - “pack”
发生在运行时,所以它会在其中之一 pp 文件。 果然,“pp_pack”是
in pp.c. 既然我们要修改这个文件,让我们把它复制到 ppc~.

[嗯,它在 pp.c 写这个教程的时候。 它现在已经与
“pp_unpack”到它自己的文件, pp_pack.c]

现在让我们看看“pp_pack”:我们将一个模式带入“pat”,然后循环遍历
模式,依次将每个格式字符转换为“datum_type”。 然后对于每一个可能的
格式字符,我们吞噬了模式中的其他参数(字段宽度,
星号等)并将下一个块输入转换为指定的格式,添加它
到输出SV“猫”上。

我们如何知道“U”是否是“pat”中的第一个格式? 好吧,如果我们有一个指向
“pat”的开始,如果我们看到一个“U”,我们可以测试我们是否还在开始
字符串。 所以,这里是“pat”设置的地方:

来自len的STRLEN;
char *pat = SvPVx(*++MARK, fromlen);
char *patend = pat + fromlen;
I32 镜头;
I32 数据类型;
SV *来自str;

我们将在那里有另一个字符串指针:

来自len的STRLEN;
char *pat = SvPVx(*++MARK, fromlen);
char *patend = pat + fromlen;
+ 字符 *patcopy;
I32 镜头;
I32 数据类型;
SV *来自str;

就在我们开始循环之前,我们将“patcopy”设置为“pat”的开始:

项目 = SP - MARK;
标记++;
sv_setpvn(猫,“”,0);
+ patcopy = 拍;
而 (pat < patend) {

现在,如果我们看到字符串开头的“U”,我们打开“UTF8”标志
输出 SV,“猫”:

+ if (datumtype == 'U' && pat==patcopy+1)
+ SvUTF8_on(猫);
如果(数据类型 == '#'){
while (pat < patend && *pat != '\n')
拍++;

请记住,它必须是“patcopy+1”,因为字符串的第一个字符是
“U”已经被“数据类型”吞没了!

糟糕,我们忘记了一件事:如果模式开头有空格怎么办? “盒(”
U*", @stuff)" 会将 "U" 作为第一个活动字符,即使它不是第一个
图案中的东西。 在这种情况下,我们必须将“patcopy”与“pat”一起推进
见空格:

如果(isSPACE(数据类型))
继续;

需要成为

如果(isSPACE(数据类型)){
复制++;
继续;
}

行。 C部分就这样完成了。 现在我们必须在这个补丁发布之前做两件额外的事情
准备就绪:我们已经更改了 Perl 的行为,因此我们必须记录该更改。 我们
还必须提供更多的回归测试以确保我们的补丁有效且无效
在线路上的其他地方创建一个错误。

测试 补丁
每个操作员的回归测试位于 最佳/,所以我们复制 t/op/pack.t
t/op/pack.t~. 现在我们可以将我们的测试添加到最后。 首先,我们将测试“U”是否
确实创建Unicode字符串。

t/op/pack.t 有一个明智的 好的() 函数,但如果没有,我们可以使用
t/test.pl。

需要'./test.pl';
计划(测试 => 159);

所以而不是这个:

打印 'not ' 除非 "1.20.300.4000" eq sprintf "%vd",
包("U*",1,20,300,4000);
打印 "ok $test\n"; $测试++;

我们可以写出更合理的(见 Test::More 完整解释 是() 和别的
测试功能)。

is("1.20.300.4000", sprintf "%vd", pack("U*",1,20,300,4000),
"U* 产生 Unicode" );

现在我们将测试我们是否正确地处理了刚开始的业务:

is("1.20.300.4000", sprintf "%vd", pack(" U*",1,20,300,4000),
"开头有空格");

最后我们将测试我们不制作 Unicode 字符串,如果“U”是 不需要 第一个活跃
格式:

isnt(v1.20.300.4000, sprintf "%vd", pack("C0U*",1,20,300,4000),
"U* not first 不是 Unicode" );

一定不要忘记更改出现在顶部的测试数量,否则
自动化测试人员会感到困惑。 这将如下所示:

打印“1..156\n”;

或这个:

计划(测试 => 156);

我们现在编译 Perl,并通过测试套件运行它。 我们的新测试通过了,万岁!

记录文件 补丁
最后,文档。 在文书工作结束之前,工作永远不会完成,所以让我们
描述我们刚刚做出的改变。 相关的地方是 pod/perlfunc.pod; 再次,我们
制作一个副本,然后我们将这段文字插入到“pack”的描述中:

= 项目 *

如果模式以 C 开头,则结果字符串将被处理
作为 UTF-8 编码的 Unicode。 您可以在字符串中强制使用 UTF-8 编码
带有初始 C , 后面的字节将被解释为
Unicode 字符。 如果你不想发生这种情况,你可以开始
你的模式与 C (或其他任何东西)强制 Perl 不使用 UTF-0
编码你的字符串,然后用 C 跟随它在你的某个地方
格局。

提交
有关如何提交此补丁的详细信息,请参阅 perlhack。

使用 onworks.net 服务在线使用 perlhacktut


免费服务器和工作站

下载 Windows 和 Linux 应用程序

Linux 命令

Ad