Создание строки выполняется с использованием "abc"
.
Создание оператора выполняется с использованием sub { $_[0] eq $_[1] }
или как eval('$_[0] eq $_[1]')
.
Это не дублирует оператора; они создают его.
В комментариях вы продолжаете настаивать на своем вопросе, спрашиваете, возможно ли получить ссылку на оператора без его создания (сначала «обернуть» его кодом). Очевидно, ответ отрицательный.
вопрос, с другой стороны, спрашивает, если это возможно, чтобы получить ссылку на оператора, или, скорее, eq
конкретно.
можно получить ссылку на некоторые операторы, используя \&CORE::op_name
[1], но не eq
. Автоматическая генерация вспомогательного устройства, использующего этот синтаксис, поддерживается только для операторов, синтаксис которых может быть аппроксимирован подпрограммой с прототипом [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
).
Как будет использоваться функция сравнения? –
Должен ли я считать, что это означает «нет, но, может быть, вы можете решить его каким-то другим способом»? Я тоже заинтересован в ответе. Я обновил вопрос. –