使用"abc" 创建字符串。
使用sub { $_[0] eq $_[1] } 或类似eval('$_[0] eq $_[1]') 来创建运算符。
这些不会重复操作符;他们创造了它。
在 cmets 中,您一直坚持您的问题是询问是否有可能在不首先创建运算符(将其“包装”在代码中)的情况下获得对运算符的引用。显然,答案是否定的。
另一方面,这个问题询问是否有可能获得对运算符的引用,或者更确切地说,是对 eq 的引用。
可以使用\&CORE::op_name[1] 引用某些运算符,但不能使用eq。使用该语法自动生成 sub 仅支持其语法可以由带有原型的 sub 近似的运算符[2]。
当然,您可以轻松地自己创建运算符的可调用实例,而不是让 Perl 为您创建它:
my $eq = sub { $_[0] eq $_[1] };
compare("OTHER_KEY", $eq)
或
sub eq { $_[0] eq $_[1] }
compare("OTHER_KEY", \&eq)
如果你想避免代码重复(有一堆类似的子声明),你可以使用eval。
eval("sub $_ { \$_[0] $_ \$_[1] }")
for qw( eq ne gt lt );
compare("OTHER_KEY", \&eq)
您可以简单地使用以下内容,但这会非常浪费和危险:
sub compare {
ref($_[1])
? $_[1]->($val, $_[0])
: eval("\$val $_[1] \$_[0]")
}
compare("OTHER_KEY", "eq")`
如果您不想涉及任何潜艇,唯一的选择是:
sub compare {
ref($_[1]) ? $_[1]->($val, $_[0]) :
$_[1] eq "eq" ? $val eq $_[0] :
$_[1] eq "ne" ? $val ne $_[0] :
$_[1] eq "lt" ? $val lt $_[0] :
$_[1] eq "gt" ? $val gt $_[0] :
die "Bad argument";
}
自 5.16 起。
仅适用于 prototype("CORE::op_name") 为其返回定义值的那些。这适用于一些命名的列表运算符(例如length)和一些命名的一元运算符(例如time),但不适用于任何命名的二元运算符(例如eq)。