如何在Perl中全局覆盖方法

时间:2015-09-17 11:20:34

标签: perl override method-overriding

我被迫使用旧版本的Apache2 :: Cookie类,其中包含方法fetch()中的错误。 我试图在启动脚本中覆盖方法,但它在以后的其他模块中不起作用:

local *Apache2::Cookie::fetch = sub { ... }

如何全局覆盖所有其他模块的方法?

1 个答案:

答案 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已经加载了文件,并且在其内部安装了软件包。然后你覆盖子。然后它再次没有被加载,并且当它被调用时你的修复仍然完好无损。