gpt4 book ai didi

eclipse - 为什么 Perl 调试器不使用 do 在断点处停止,而是使用 require 停止?

转载 作者:行者123 更新时间:2023-12-02 13:46:45 26 4
gpt4 key购买 nike

在Eclipse中使用Perl EPIC调试器时,为什么执行不是在'do'模块中的断点处停止,而是在'require'模块处停止?

script.pl

use strict;

#use sample; # <-- Execution stops at breakpoint in printMessage() of 'sample.pm'
#require sample; # <-- Execution stops at breakpoint in printMessage() of 'sample.pm'
#do 'sample.pm'; # <-- Execution DO NOT STOP at breakpoint in printMessage() of 'sample.pm'

sample::printMessage();

样本.pm

package sample;

sub printMessage
{
print 'new message!';
}

1;

最佳答案

我在 Komodo IDE 和命令行中尝试了此操作,并得到了相同的结果。

如果您userequire一个文件,Perl 将文件名保存在 %INC 中。这可确保文件仅加载一次。您可以在许多不同的其他模块中require相同的模块,并使用sample::printMessage()等函数。第一个 require 将被完成,所有其他的都将被忽略,因为已经有一个键 $INC{'sample'} = './sample.pm' %INC

require sample;
require sample;
require sample;

sample::printMessage();

__END__
new message!

如果您使用模块而不是require模块,则同样适用,因为use只是一个require以及 BEGIN block 中的 import。在这两种情况下,Perl 都记得这一点。我的假设(尚未找到证明这一点的文档)是,调试器能够执行相同的操作,甚至读取内部 %INC

现在,如果您执行一个文件,则%INC机制不会触发,这意味着您可以执行一遍又一遍地查看文件。它不关心文件的名称。其结果是,如果您多次执行该文件,即使没有使用警告,它也会提示。

do 'sample.pm';
do 'sample.pm';
do 'sample.pm';

__END__
Subroutine printMessage redefined at sample.pm line 4.
Subroutine printMessage redefined at sample.pm line 4.
new message!

我的猜测是调试器也不记得,因此它不知道它已经加载了sample.pmdoc说:

Uses the value of EXPR as a filename and executes the contents of the file as a Perl script.

do 'stat.pl';

is largely like

eval `cat stat.pl`;

所以它只会吞入文件并执行内容。没有%INC。调试器没有文件名(顺便说一句,EPIC 中的调试器与 Komodo IDE 中命令行上的调试器相同,图形调试器只是连接到 Perl 调试器)。因此,当代码显示 do 时,您的断点将被忽略。

如果您希望调试器在 sample.pm 中的第 5 行停止,即使您这样做了,您也可以通过添加 告诉调试器这样做$DB::single = 1; 到上面的行。

package sample;

sub printMessage
{
$DB::single = 1;
print 'new message!';
}

这记录在perldebug中。它将使调试器停止在下一行,相当于在调试器中键入 s,或单击 EPIC 调试器中的单步按钮。

<小时/>

另请参阅:

关于eclipse - 为什么 Perl 调试器不使用 do 在断点处停止,而是使用 require 停止?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19824641/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com