2

我正在使用Eclipse Kepler Service Release 2、EPIC 0.5.46和 Strawberry Perl 5 版本 18 进行 perl 编程。对于调试,我使用的是Eclipse 调试器和 PadWalker

我有一个交互式 perl 程序,它根据用户对多个提示提供的答案写入文件。在调试时,每次我更改一行代码时,我都必须再次重新运行整个程序并为每个提示提供输入,这真的很耗时。

有没有办法在调试会话中间对子例程中的代码进行更改,以便指令指针将自身重置到该子例程的第一行。这样我就不必重新启动会话来重新编译新代码。

感谢您的意见和建议。谢谢你!!!

4

1 回答 1

1

你想做的事情都可以做到,我自己在Perl中做过很多次。例如,看到这个

但是,尽管您所描述的可能有效(并且有点危险),但它的执行方式通常有所不同且更安全。

第一个必须假设一种常规的命令结构,例如命令处理器,或者说是 Web 服务器。

在命令处理器或 Web 服务器中,您读取一个命令(或获取一个 Web 请求),执行一个操作,然后读取另一个命令,执行另一个操作等等。根据您的描述,听起来您有这样的结构。

就我而言,我将每个调试器命令都存储在 Perl 文件中。这不仅有助于促进这项任务,而且有助于理解、测试和更改代码。

鉴于这种程序结构,您无需尝试更改程序计数器,而是完成命令并在即将读取新命令的级别进行更改,然后重新加载更改代码的文件。

执行此操作的特定 Perl 构造称为do。不要使用requireuse which 将加载到 Perl 文件中,前提是该文件或模块以前没有加载过。在您的情况下,即使之前已加载,您也希望重新加载。

那么现在如何才能发出do命令呢?正如您所建议的,您可以通过调试器来完成。假设您具有如上所述的整个程序结构,您将断点放置在调用者中的某个公共点处,该点循环处理要处理的内容,而不是尝试在单个命令中更改内容。

而且您甚至不需要调试器来执行此操作!许多 Web 框架(如 Ruby on Rails)都有“开发”模式,它们在实现功能的文件上保存时间戳。如果文件已更改,他们会在运行请求之前发出“do”命令。

于 2015-05-18T21:42:30.597 回答