我被迫使用旧版本的Apache2 :: Cookie类,其中包含方法fetch()中的错误。 我试图在启动脚本中覆盖方法,但它在以后的其他模块中不起作用:
local *Apache2::Cookie::fetch = sub { ... }
如何全局覆盖所有其他模块的方法?
答案 0 :(得分:4)
作为Sobrique pointed out in their comment,*Apache2::Cookie::fetch = sub { ... }; # note ... is valid syntax
require 'foo';
$cookie = Apache2::Cookie->new; # not sure if that is correct
# in foo.pm
use Apache2::Cokie; # this will overwrite your implementation
肯定是个问题。但不是唯一的。
在执行此操作之前,您需要先加载pacakge。 Perl将采用sub的最后一个定义,就像最后指定的值将是变量的值一样。
%INC
你的覆盖也是如此。
use
在Perl中加载模块可以使用import
,这是一个超级全局哈希,可以跟踪已加载的文件。如果你use Apache2::Cookie;
BEGIN {
*Apache2::Cookie::fetch = sub { ... };
}
require 'foo'; # or use, no matter
$cookie = Apache2::Cookie->new; # not sure if that is correct
# in foo.pm
use Apache2::Cokie; # now this won't overwrite your implementation
两次文件,它只会在第一次加载和解析。第二次,它只会在包裹上调用<table class="col-md-6 table" id="prof-table">
<tbody><tr>
<th>HORÁRIO</th>
<th data-dia="seg">Segunda-Feira</th>
<th data-dia="ter">Terça-Feira</th>
<th data-dia="qua">Quarta-Feira</th>
<th data-dia="qui">Quinta-Feira</th>
<th data-dia="sex">Sexta-Feira</th>
</tr>
<tr>
<td>08:30 ~ 10:30</td>
<td>
<ol>
<li data-prof="3">Lab I</li>
</ol>
</td>
</tr>
<tr>
<td>10:30 ~ 12:30</td>
<td>
</td>
<td>
<ol>
<li data-prof="3">Lab II</li>
</ol>
</td>
</tr>
<tr>
<td>14:30 ~ 16:30</td>
</tr>
<tr>
<td>16:30 ~ 18:30</td>
</tr>
<tr>
<td>18:30 ~ 20:30</td>
</tr>
<tr>
<td>20:30 ~ 21:30</td>
</tr>
<tr>
<td>21:30 ~ 23:30</td>
</tr>
</tbody></table>
。
所以诀窍是首先加载Apache2 :: Cookie,所以当实际代码再次加载它时,它已经被解析了。
<li>
现在Perl已经加载了文件,并且在其内部安装了软件包。然后你覆盖子。然后它再次没有被加载,并且当它被调用时你的修复仍然完好无损。