小编Wor*_*ame的帖子

将子程序传递给模块并重新定义它?

我正在尝试使用接收子例程的方法创建一个模块并重新定义它.我在主脚本中重新定义子例程没有问题,但是相同的语法似乎在方法内部不起作用:

main.pl

use strict;
use warnings;
use ReDef;

sub orig{
    print "Original!\n";
}
orig;
*orig=sub{print "not Original!\n";};
orig;
ReDef::redef(\&orig);
orig;
Run Code Online (Sandbox Code Playgroud)

ReDef.pm

package ReDef;

use strict;
use warnings;

sub redef {
    my $ref=shift;
    *ref = sub {print "Redefined!";} 
}

1;
Run Code Online (Sandbox Code Playgroud)

测试输出:

perl main.pl
Original!
Subroutine main::orig redefined at main.pl line 9.
not Original!
not Original!
Run Code Online (Sandbox Code Playgroud)

ReDef :: redef()不会重新定义.我看到它的方式,*ref是一个coderef并指定给它另一个子程序应该改变main :: orig();

什么是正确的语法?

perl

7
推荐指数
2
解决办法
515
查看次数

为什么不= 2 == 4返回false?

我来自C++背景,我正在尝试使用Beginning Perl学习perl.但是,第二章中的这段代码让我感到困惑:

#!/usr/bin/perl
use warnings;
print"Is two equal to four? ", 2 == 4, "\n";
Run Code Online (Sandbox Code Playgroud)

当我运行代码时,这是输出:

Is two equal to four? 
Run Code Online (Sandbox Code Playgroud)

下面进一步解释,2 == 4的值是未定义的,但这对我来说似乎令人困惑和反直觉.两个显然不等于四,4和4之间的相同比较将产生真,导致输出结束时为'1'.为什么表达式不返回false?

perl

4
推荐指数
2
解决办法
339
查看次数

标签 统计

perl ×2