你想做的事情都可以做到,我自己在Perl中做过很多次。例如,看到这个。
但是,尽管您所描述的可能有效(并且有点危险),但它的执行方式通常有所不同且更安全。
第一个必须假设一种常规的命令结构,例如命令处理器,或者说是 Web 服务器。
在命令处理器或 Web 服务器中,您读取一个命令(或获取一个 Web 请求),执行一个操作,然后读取另一个命令,执行另一个操作等等。根据您的描述,听起来您有这样的结构。
就我而言,我将每个调试器命令都存储在 Perl 文件中。这不仅有助于促进这项任务,而且有助于理解、测试和更改代码。
鉴于这种程序结构,您无需尝试更改程序计数器,而是完成命令并在即将读取新命令的级别进行更改,然后重新加载更改代码的文件。
执行此操作的特定 Perl 构造称为do。不要使用require或use which 将加载到 Perl 文件中,前提是该文件或模块以前没有加载过。在您的情况下,即使之前已加载,您也希望重新加载。
那么现在如何才能发出do命令呢?正如您所建议的,您可以通过调试器来完成。假设您具有如上所述的整个程序结构,您将断点放置在调用者中的某个公共点处,该点循环处理要处理的内容,而不是尝试在单个命令中更改内容。
而且您甚至不需要调试器来执行此操作!许多 Web 框架(如 Ruby on Rails)都有“开发”模式,它们在实现功能的文件上保存时间戳。如果文件已更改,他们会在运行请求之前发出“do”命令。