我有一些代碼檔案開頭像
use my_pck;
BEGIN {
package my_pck;
my(@p) = ();
foreach ( keys(%my_pck::) ) {
push( @p, "\$$_" ) if (defined $$_);
push( @p, "\%$_" ) if (%$_);
push( @p, "\@$_" ) if (@$_);
}
# ... some extra
( @EXPORT = @p, Exporter::import pal ) if ( $#p >= 0 );
}
use strict;
use warnings;
package my_pck;
這部分我不能改變(除了在“一些額外的”中添加一些東西)。
所以現在有一個名為“my_today”的子檔案,因為我需要package my_pck在源檔案中經常使用它的任何地方使用它。此方法以“YYYYMMDD”格式給出當前日期作為數字。
要檢查前一天的一些測驗資料,我需要重新定義此方法以提供前一天。
我試圖重新定義它
sub my_today {
my $date = my_pck::my_today();
$date = my_datefunc($date, "-", 1) # substracts one day
return $day;
}
但所以我得到一個錯誤:
Subroutine my_today redefined at ./my_file.pl line 123.
Deep recursion on subroutine "my_pck::my_today" at ./my_file.pl line 124.
Out of memory!
我該如何解決這個問題?我無法更改整個代碼,因為它太多了。
uj5u.com熱心網友回復:
你通常想要
{
my $old_my_today = \&my_pck::mytoday;
my $new_my_today = sub { my_pck::my_datefunc($old_my_today->(), "-", 1) };
no warnings qw( redefine );
*my_pck::mytoday = $new_my_today;
}
問題是新代碼必須出現在 sub 被替換之前,但我們需要在模塊的其余部分編譯后執行它。為此,我們將使用UNITCHECK.
UNITCHECK塊在定義它們的單元被編譯之后運行。主程式檔案,并且每個模塊它負載是編譯單元,因為是字串eval使用已編譯S,運行時代碼(?{ })構建體在一個正則運算式,呼叫do FILE,require FILE以及之后的代碼-e在命令列上開關。
UNITCHECK {
my $old_my_today = \&my_pck::mytoday;
my $new_my_today = sub { my_pck::my_datefunc($old_my_today->(), "-", 1) };
no warnings qw( redefine );
*my_pck::mytoday = $new_my_today;
}
演示
my_pck.pm:
BEGIN {
UNITCHECK {
my $old_my_today = \&my_pck::mytoday;
my $new_my_today = sub { my_pck::my_datefunc($old_my_today->(), "-", 1) };
no warnings qw( redefine );
*my_pck::mytoday = $new_my_today;
}
}
package my_pck;
sub mytoday { 20211011 }
sub my_datefunc { $_[0] - 1 }
1
$ perl -I . -M5.010 -e'use my_pck; say my_pck::mytoday'
20211010
(BEGIN絕對沒有必要;它只是為了表明UNITCHECK可以在您描述的情況下使用。)
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/316252.html
標籤:perl 包裹 perl-exporter
