我正在尝试使用接收子例程的方法创建一个模块并重新定义它.我在主脚本中重新定义子例程没有问题,但是相同的语法似乎在方法内部不起作用:
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)
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();
什么是正确的语法?
我来自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 ×2