@H_403_1@
有没有办法在调用者中为重载运算符抑制特定警告?
背景:我正在查看一个重载< =和> =的模块,以实现一种声明性域特定的语言.无论这是否是一个好主意,这些运算符在void上下文中使用时会抛出“在void上下文中无用”警告.就像是:
package Boundary; use strict; use overload ('<=' => \&set_min,'>=' => \&set_max); sub new { my ($class,$min,$max) = @_; bless [ $min,$max ],$class; } sub set_min { my $self = shift; $self->[0] = shift; } sub set_max { my $self = shift; $self->[1] = shift; } package main; # user code use warnings; my $bound = Boundary->new(); $bound >= 1; # Useless use of numeric ge (>=) in void context at ... $bound <= 10; # Useless use of numeric le (>=) in void context at ...
解决方法
Perl期望在重载运算符时保留现有的语义.例如它有时会优化否定.你正在玩火.
$perl -MO=Concise,-exec -e'$y = !$x;' 1 <0> enter 2 <;> nextstate(main 1 -e:1) v:{ 3 <$> gvsv(*x) s 4 <1> not sK/1 <--- "not" operator 5 <$> gvsv(*y) s 6 <2> sassign vKS/2 7 <@> leave[1 ref] vKP/REFC -e Syntax OK $perl -MO=Concise,-exec -e'if (!$x) { f() }' 1 <0> enter 2 <;> nextstate(main 3 -e:1) v:{ 3 <$> gvsv(*x) s 4 <|> or(other->5) vK/1 <--- No "not" operator 5 <0> pushmark s 6 <$> gv(*f) s/EARLYCV 7 <1> entersub[t1] vKS/TARG,1 8 <@> leave[1 ref] vKP/REFC -e Syntax OK